Удалить суб-массив содержит общие элементы


0

Я понял. Вот код:

function merge(arr){
  var input = [];
  for(var i = 0; i < arr.length; i++){
    input.push(arr[i]);
  } 
  if (arr.length >= 2) {
    for (var i = 0; i < arr.length; i++) {
      for (var j = i+1; j < arr.length; j++) {
        var arr_new = arr[i].concat(arr[j]);
        //remove duplicates
        var arr_merge = arr_new.filter(function (item, pos) {return arr_new.indexOf(item) == pos});
        if (arr_merge.length < arr_new.length) {
          arr.splice(arr.indexOf(arr[i]), 1, arr_merge);
          arr.splice(arr.indexOf(arr[j]),1);
          j--;
        }
      }   
    }
    if (!arraysEqual(input, arr)) {merge(arr)};
  }
  return arr;
  //Input:[[1,2], [3,4], [1,3], [5,6], [6,5]]
  //Output:[[1,2,3,4], [5,6]]
}

function arraysEqual(a, b) {
  if (a === b) return true;
  if (a == null || b == null) return false;
  if (a.length != b.length) return false;

  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

0

Вы можете использовать две таблицы хэша, одну для элементов и их groupsи для результата sets.

В основном алгоритм генерирует для той же группы объект со свойством и массивом, поскольку он позволяет сохранить ссылку на объект при назначении нового массива.

Основная часть - итерация внешнего массива, а затем внутренних массивов и проверка внутри, если это первый элемент, затем проверьте хеш-таблицу на наличие и если она не существует, сгенерируйте новый объект со свойством values ??и пустой массив как значение , Также назначьте фактический объект с setsпомощью элемента как ключа.

На следующем шаге хэш-таблица снова проверяется, а если нет, то назначьте объект первого элемента.

Для сохранения только уникальных значений выполняется проверка, и если элемент не существует, элемент переносится в массив значений хэш-таблицы.

Затем часть для объединения массивов следует проверять, если объект первого элемента не равен объекту фактического элемента. Если это так, он удаляет из setsключа из первого элемента значения фактических элементов и объединяет массив фактических элементов с значениями объекта первого элемента. Затем объект значений присваивается объекту фактического объекта.

Позже setsони сопоставляются с результирующим набором с итерированием setsобъекта, а свойство values ??принимается за значение.

var array = [[1, 2], [3, 4], [1, 3], [5, 6], [6, 5]],
    groups = {},
    sets = {},
    result;
    
array.forEach(function (a) {
    a.forEach(function (b, i, bb) {
        if (i === 0 && !groups[b]) {
            groups[b] = { values: [] };
            sets[b] = groups[b];
        }
        if (!groups[b]) {
            groups[b] = groups[bb[0]];
        }
        if (groups[b].values.indexOf(b) === -1) {
            groups[b].values.push(b);
        }
        if (groups[bb[0]] !== groups[b]) {
            delete sets[groups[b].values[0]];
            groups[bb[0]].values = groups[bb[0]].values.concat(groups[b].values);
            groups[b].values = groups[bb[0]].values;                    
        }
    });    
});

result = Object.keys(sets).map(function (k) {
    return sets[k].values;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

JavaScript, массивы,

javascript,arrays,

0

Ответов: 2


0

Я понял. Вот код:

function merge(arr){
  var input = [];
  for(var i = 0; i < arr.length; i++){
    input.push(arr[i]);
  } 
  if (arr.length >= 2) {
    for (var i = 0; i < arr.length; i++) {
      for (var j = i+1; j < arr.length; j++) {
        var arr_new = arr[i].concat(arr[j]);
        //remove duplicates
        var arr_merge = arr_new.filter(function (item, pos) {return arr_new.indexOf(item) == pos});
        if (arr_merge.length < arr_new.length) {
          arr.splice(arr.indexOf(arr[i]), 1, arr_merge);
          arr.splice(arr.indexOf(arr[j]),1);
          j--;
        }
      }   
    }
    if (!arraysEqual(input, arr)) {merge(arr)};
  }
  return arr;
  //Input:[[1,2], [3,4], [1,3], [5,6], [6,5]]
  //Output:[[1,2,3,4], [5,6]]
}

function arraysEqual(a, b) {
  if (a === b) return true;
  if (a == null || b == null) return false;
  if (a.length != b.length) return false;

  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

0

Вы можете использовать две таблицы хэша, одну для элементов и их groupsи для результата sets.

В основном алгоритм генерирует для той же группы объект со свойством и массивом, поскольку он позволяет сохранить ссылку на объект при назначении нового массива.

Основная часть - итерация внешнего массива, а затем внутренних массивов и проверка внутри, если это первый элемент, затем проверьте хеш-таблицу на наличие и если она не существует, сгенерируйте новый объект со свойством values ??и пустой массив как значение , Также назначьте фактический объект с setsпомощью элемента как ключа.

На следующем шаге хэш-таблица снова проверяется, а если нет, то назначьте объект первого элемента.

Для сохранения только уникальных значений выполняется проверка, и если элемент не существует, элемент переносится в массив значений хэш-таблицы.

Затем часть для объединения массивов следует проверять, если объект первого элемента не равен объекту фактического элемента. Если это так, он удаляет из setsключа из первого элемента значения фактических элементов и объединяет массив фактических элементов с значениями объекта первого элемента. Затем объект значений присваивается объекту фактического объекта.

Позже setsони сопоставляются с результирующим набором с итерированием setsобъекта, а свойство values ??принимается за значение.

var array = [[1, 2], [3, 4], [1, 3], [5, 6], [6, 5]],
    groups = {},
    sets = {},
    result;
    
array.forEach(function (a) {
    a.forEach(function (b, i, bb) {
        if (i === 0 && !groups[b]) {
            groups[b] = { values: [] };
            sets[b] = groups[b];
        }
        if (!groups[b]) {
            groups[b] = groups[bb[0]];
        }
        if (groups[b].values.indexOf(b) === -1) {
            groups[b].values.push(b);
        }
        if (groups[bb[0]] !== groups[b]) {
            delete sets[groups[b].values[0]];
            groups[bb[0]].values = groups[bb[0]].values.concat(groups[b].values);
            groups[b].values = groups[bb[0]].values;                    
        }
    });    
});

result = Object.keys(sets).map(function (k) {
    return sets[k].values;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

JavaScript, массивы,
Похожие вопросы