2015-05-28 2 views
0

У меня есть массив массивов, который выглядит следующим образом:Удалить дубликаты из массива массивов по первому объекту

arr = [ 
["Bob","USA","55"], 
["Frank","Canada","20"], 
["Bob","UK","35"], 
["Bob","France","38"], 
["Anna","Poland","22"] 
] 

Я хотел бы удалить дубликаты массивов, которые имеют то же значение на первую позицию (то же самое имя) - поэтому я хотел бы, чтобы мой выход будет выглядеть:

arr = [ 
["Bob","USA","55"], 
["Frank","Canada","20"], 
["Anna","Poland","22"] 
] 

Я пытаюсь сделать это таким образом:

uniqueArr = [] 
for (var i in arr) { 
if (uniqueArr.indexOf(arr[i][0]) === -1)) { 
uniqueArr.push(arr[i][0]) 
} 

Все работает нормально - мой вывод выглядит как Bob, Frank, Anna

Но проблема в том, что я пытаюсь восстановить целые массивы с уникальным именем. Когда я делаю:

uniqueArr = [] 
for (var i in arr) { 
if (uniqueArr.indexOf(arr[i][0]) === -1)) { 
uniqueArr.push(arr[i]) 
} 

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

+1

Проблема заключается в том, когда вы нажимаете на весь массив на 'uniqueArr', вы не можете просто использовать' indexOf' на нем больше, потому что она больше не содержит простые строки. – CodingIntrigue

+0

Я удалил тэг 'jQuery', потому что это не имеет значения здесь –

ответ

3

Вы можете следить за key строки в отдельном массиве и отслеживать, что вместо того, чтобы, например:

var uniqueArr = [], 
    keys = []; // Create an array for storing the key values 
for (var i in arr) {  
    if (keys.indexOf(arr[i][0]) === -1) { 
     uniqueArr.push(arr[i]); // Push the value onto the unique array 
     keys.push(arr[i][0]); // Push the key onto the 'key' array 
    } 
} 
console.log(uniqueArr); 

jsFiddle example

0

попробовать

arr = [ 
    ["Bob", "USA", "55"], 
    ["Frank", "Canada", "20"], 
    ["Bob", "UK", "35"], 
    ["Bob", "France", "38"], 
    ["Anna", "Poland", "22"] 
] 
var newArr = []; 
for (var i = 0; i < arr.length; i++) { 
    if (isInArr(newArr, arr[i]) == -1) { 
     newArr.push(arr[i]); 
    } 
} 

function isInArr(checkArr, value) { 
    var index = -1; 
    for (var i = 0; i < checkArr.length; i++) { 
     if (checkArr[i][0] == value[0]) { 
      index = i; 
      break; 
     } 
    } 
    return index; 
} 

console.log(newArr) 

DEMO

0

Взгляните на функцию unique2. Оно работает!

originalArr = [ 
 
    ["Bob", "USA", "55"], 
 
    ["Frank", "Canada", "20"], 
 
    ["Bob", "UK", "35"], 
 
    ["Bob", "France", "38"], 
 
    ["Anna", "Poland", "22"] 
 
]; 
 

 
function unique(arr) { 
 
    uniqueArr = []; 
 
    for (var i in arr) { 
 
    if (uniqueArr.indexOf(arr[i][0]) === -1) { 
 
     uniqueArr.push(arr[i]); 
 
    } 
 
    } 
 
    return uniqueArr; 
 
} 
 

 
function unique2(arr) { 
 
    uniqueArr = []; 
 
    keys = []; 
 
    for (var i in arr) { 
 
    if (keys.indexOf(arr[i][0]) === -1) { 
 
     uniqueArr.push(arr[i]); 
 
     keys.push(arr[i][0]); 
 
    } 
 
    } 
 
    return uniqueArr; 
 
} 
 

 

 

 
var response = document.getElementById('response'); 
 
response.textContent = JSON.stringify(unique(originalArr)); 
 

 
var response2 = document.getElementById('response2'); 
 
response2.textContent = JSON.stringify(unique2(originalArr));
<h1>Your code</h1> 
 
<div id="response"></div> 
 

 
<h1>My code</h1> 
 
<div id="response2"></div>

Смежные вопросы