Сравнение многомерного массива по 2 элементам

297
04 мая 2017, 14:55

Здравствуйте,

Есть данный код

var arr = [ 
  [50, 50, '3'], 
  [1, 1, '6'], 
  [50, 50, '9'] 
]; 
 
for (let j = 0; j < arr.length; j++) { 
  for (let n = 0; n < arr.length; n++) { 
    if (arr[j][n] == arr[j++][n++]) { 
      arr[j].splice(2, 1); 
    } 
  } 
} 
 
console.log(arr);

Необходимо сравнивать по двум элементам. То есть если первые элементы совпадают сравнивать второй элемент и если они тоже совпадают удалять 3 элемент у совпавших массивов.

на выходе должен получиться массив:

arr = [ 
  [50, 50],
  [1,1,'6'],
  [50,50]
];
Answer 1

Не такая простая задача как может показаться. По-моему, без двойного прохода тут не обойтись.

Для начала вам требуется пройтись по элементам и собрать информацию о повторениях.

После пройтись для удаления ненужных элементов.

В итоге получилось что-то вроде этого (это можно оптимизировать):

var arr = [ 
  [50,50,'3'], 
  [1,1,'6'], 
  [50,50,'9'] 
]; 
 
var counter = []; 
 
for(let j = 0; j < arr.length; j++) { 
  if (arr[j][0] == arr[j][1]) { 
    counter.push(arr[j][0]); 
  } 
} 
 
for(let j = 0; j < arr.length; j++) { 
  if (getCountOfElement(arr[j][0]) > 1){ 
    arr[j].splice(2, arr[j].length - 2); 
  } 
} 
 
function getCountOfElement(value) { 
    var count = 0; 
    for (var i = 0; i < counter.length; ++i){ 
        if(counter[i] == value) 
            count++; 
    } 
 
    return count; 
} 
 
console.log(arr);

Answer 2

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

Например так:

var arr = [ 
  [50, 50, '3'], 
  [1, 1, '6'], 
  [50, 50, '9'] 
]; 
 
var res = arr.map(function(el) { 
  var group = el.slice(0, 2); 
  if (this[group] === true) { 
    return group; 
  } 
 
  if (this[group]) { 
    this[group].splice(2, 1); 
    this[group] = true; 
    return group; 
  } 
  return this[group] = el; 
 
}, {}) 
 
console.log(res);

READ ALSO
Цикл for с пошаговой итерацией на javascript

Цикл for с пошаговой итерацией на javascript

Подскажите, как исправить код, чтобы при каждом клике по btn_refresh запускался цикл и в консоле выводился результатТ

373