2013-12-02 4 views
3

У меня есть многомерный массив:Как удалить дубликаты из многомерного массива?

[[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]] 

Есть ли умный способ удалить дублированные элементы из этого? Он должен вернуть такой массив:

[[7,3], [3,8], [1,2]] 

Спасибо!

+0

См http://stackoverflow.com/questions/13486479/javascript-array-unique – Matt

+0

@ Matt: Я читал эту тему, прежде чем , но речь идет о простом массиве, а не о многомерном. –

+0

Итерации по каждой записи в массиве, поиск дубликатов. это единственный способ. –

ответ

6
arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]; 

function multiDimensionalUnique(arr) { 
    var uniques = []; 
    var itemsFound = {}; 
    for(var i = 0, l = arr.length; i < l; i++) { 
     var stringified = JSON.stringify(arr[i]); 
     if(itemsFound[stringified]) { continue; } 
     uniques.push(arr[i]); 
     itemsFound[stringified] = true; 
    } 
    return uniques; 
} 

multiDimensionalUnique(arr); 

Explaination:

Как вы уже упоминалось выше, другой вопрос, имел дело только с единичными массивов измерения .. которые вы можете найти через IndexOf. Это облегчает задачу. Многомерные массивы не так просты, так как indexOf не работает с поиском массивов внутри.

Самый простой способ, которым я мог подумать, - сериализовать значение массива и сохранить, было ли оно уже найдено. Быстрее может сделать что-то вроде stringified = arr[i][0]+":"+arr[i][1], но тогда вы ограничиваете себя только двумя клавишами.

1
var origin = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]; 

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

function contains(array, item) { 
    for (var i = 0; i < array.length; ++i) { 
     if (arrayEqual(array[i], item)) { 
      return true; 
     } 
    } 
    return false; 
} 

function normalize(array) { 
    var result = []; 
    for (var i = 0; i < array.length; ++i) { 
     if (!contains(result, array[i])) { 
      result.push(array[i]); 
     } 
    } 
    return result; 
} 

var result = normalize(origin); 
console.log(result); 

http://jsfiddle.net/2UQH6/

2

Это требует JavaScript 1.7:

var arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]; 

arr.map(JSON.stringify).reverse().filter(function (e, i, a) { 
    return a.indexOf(e, i+1) === -1; 
}).reverse().map(JSON.parse) // [[7,3], [3,8], [1,2]] 
Смежные вопросы