Удалить повторяющийся массив

231
26 ноября 2016, 17:54

Имеется массив

var a = [
  [
    "url",
    "url",
    "url",
    "http://mall.aliexpress.com/"
  ],
  [
    "url",
    "url",
    "url",
    "http://yootube.com/"
  ],
  [
    "url",
    "url", // этот массив необходимо удалить так как доменные имена совпадают
    "url",
    "http://yootube.com/"
  ],
  [
    "url",
    "url",
    "url",
    "http://ru.stackoverflow.com/"
  ],
  [
    "url",
    "url", // этот массив необходимо удалить так как доменные имена совпадают
    "url",
    "http://ru.stackoverflow.com/"
  ],
  [
    "url",
    "url", // этот массив необходимо удалить так как доменные имена совпадают
    "url",
    "http://mall.aliexpress.com/"
  ]
];

Необходимо удалить массив который совпадает по доменному имени. Как это сделать?

Answer 1
for (var i = 0; i < a.length; i++) {
  for (var j = i + 1; j < a.length; j++) {
    if (a[i][3] == a[j][3]) {
      a.splice(i, 1);
      i = 0;
      j = 0;
    }
  }
}

var a = [ 
  [ 
    "url", 
    "url", 
    "url", 
    "http://mall.aliexpress.com/" 
  ], 
  [ 
    "url", 
    "url", 
    "url", 
    "http://yootube.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://yootube.com/" 
  ], 
  [ 
    "url", 
    "url", 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://mall.aliexpress.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://mall.aliexpress.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://yootube.com/" 
  ] 
]; 
 
for (var i = 0; i < a.length; i++) { 
  for (var j = i + 1; j < a.length; j++) { 
    if (a[i][3] == a[j][3]) { 
      a.splice(i, 1); 
      i = 0; 
      j = 0; 
    } 
  } 
} 
console.log(a)

Answer 2

Внешний цикл делает обход по всем элементам массива, внутренний идёт от i-того элемента до конца, и добавляет в массив все индексы для удаления, а затем проходим по исходному массиву и копируем элементы в новый массив, но те, которые не вошли в indexes. Результат будет в newArr.

 indexes = []
 for (var i = 0; i < a.length; i++) {
    for (var j = i + 1; j < a.length; j++) {
        if (a[i][3] == a[j][3]) {
            indexes.push(j);
        }
    }
 }
 newArr = []
 for (var i = 0; i < a.length; i++) {
    if (indexes.indexOf(i) == -1) {
       newArr.push(a[i]);
    }
 }
Answer 3

Можно воспользоваться функцией reduce

var result = a.reduce(function(acc, cur) {
  if (!acc.map[cur[3]]) { // если проверяемого элемента еще не было
    acc.map[cur[3]] = true; // пометим его, как существующий,
    acc.result.push(cur); // добавим в результирующий массив
  }
  return acc; // вернем аккумулятор
}, {
  map: {}, // хранит уникальные поля
  result: [] // хранит результирующий массив
}).result; // сохраняем в переменную результирующий массив

Пример в работе:

var a = [ 
  [ 
    "url", 
    "url", 
    "url", 
    "http://mall.aliexpress.com/" 
  ], 
  [ 
    "url", 
    "url", 
    "url", 
    "http://yootube.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://yootube.com/" 
  ], 
  [ 
    "url", 
    "url", 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://mall.aliexpress.com/" 
  ] 
]; 
 
var result = a.reduce(function(acc, cur) { 
  if (!acc.map[cur[3]]) { 
    acc.map[cur[3]] = true; 
    acc.result.push(cur); 
  } 
  return acc; 
}, { 
  map: {}, 
  result: [] 
}).result; 
 
console.log(result);
.as-console-wrapper { 
  top: 0; 
  max-height: 100% !important; 
}

Если нужно проверять полное совпадение массивов, вместо проверки конкретного элемента, можно отсортировать массив привести к сторке - отсортированные массивы с одинаковыми элементами дадут одинакокую строку:

var result = a.reduce(function(acc, cur) {
  var key = [...cur].sort();
  if (!acc.map[key]) {
    acc.map[key] = true;
    acc.result.push(cur);
  }
  return acc;
}, {
  map: {},
  result: []
}).result;

Пример:

var a = [ 
  [ 
    "url", 
    "url", 
    "url", 
    "http://mall.aliexpress.com/" 
  ], 
  [ 
    "url", 
    "url", 
    "url", 
    "http://yootube.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://yootube.com/" 
  ], 
  [ 
    "url", 
    "url", 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://ru.stackoverflow.com/" 
  ], 
  [ 
    "url", 
    "url", // этот массив необходимо удалить так как доменные имена совпадают 
    "url", 
    "http://mall.aliexpress.com/" 
  ] 
]; 
 
var result = a.reduce(function(acc, cur) { 
  var key = [...cur].sort(); 
  if (!acc.map[key]) { 
    acc.map[key] = true; 
    acc.result.push(cur); 
  } 
  return acc; 
}, { 
  map: {}, 
  result: [] 
}).result; 
 
console.log(result);
.as-console-wrapper { 
  top: 0; 
  max-height: 100% !important; 
}

READ ALSO
Не подключаеться angular в расщирении chrome

Не подключаеться angular в расщирении chrome

Есть расширение ChromeВ при простому запуске html страницы скрипт работает

172
Загрузка изображений JS

Загрузка изображений JS

Ситуация такая: Есть скрипт который загружает файл на сервер, возможно ли сделать так чтобы при выборе файла не надо было нажимать кнопку...

260
Как посчить эти переменные?

Как посчить эти переменные?

Как можно реализовать именно математическое действие а не просто складывать текст вместе? Тема вроде простая но не могу понять в чем дело,...

266