2016-02-21 2 views
1

У меня есть два массива следующим образом:Удалить дубликаты из массива JavaScript Согласно другому массиву?

var Ids = ['123', '456', '789', '789']; 
var Names = ['jack', 'jack', 'peter', 'peter']; 

Теперь мне нужно, чтобы удалить повторяющиеся значения в Ids массиве, а затем в соответствии с этим, удалять значения в Names массиве.


можно удалить повторяющиеся значения для каждого массива отдельно, используя .filter() так:

var Unique_Ids = Ids.filter(function(item, pos) { return Ids.indexOf(item) == pos; }); 
//=> 123, 456, 789 

var Unique_Names = Ids.filter(function(item, pos) { return Names.indexOf(item) == pos; }); 
//=> jack, peter 

Но это не то, что мне нужно .. мне нужно количество элементов в обоих массивах равными (в данном случае 3, в соответствии с количеством товаров в Unique_Ids).


Во всяком случае то, что мне нужно это:

var Unique_Ids = ['123', '456', '789']; 
var Unique_Names = ['jack', 'jack', 'peter']; 

Как я могу это сделать?


Примечание: Я не хочу, раствор, содержащий этот indexOf() метод. Потому что он не работает на IE и старых браузерах. И я думаю, что jQuery.inArray() может быть хорошей альтернативой.

+0

Вы упоминаете вы не хотите использовать IndexOf, но вы уже делаете это? return Names.indexOf (item) – user2267175

+0

если у вас 'array.filter', у вас есть' array.indexOf' –

+0

@JaromandaX Ну, я пытаюсь найти другой подход .. – stack

ответ

1

Решение с временным объектом для идентификаторов и для цикла.

function unique(o) { 
 
    var obj = {}, 
 
     r = { ids: [], names: [] }, 
 
     i; 
 
    for (i = 0; i < o.ids.length; i++) { 
 
     if (!obj[o.ids[i]]) { 
 
      r.ids.push(o.ids[i]); 
 
      r.names.push(o.names[i]); 
 
      obj[o.ids[i]] = true; 
 
     } 
 
    } 
 
    return r; 
 
} 
 

 
var Ids = ['123', '456', '789', '789'], 
 
    Names = ['jack', 'jack', 'peter', 'peter'], 
 
    result = unique({ ids: Ids, names: Names }); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

1

Не самое элегантное решение, но это будет соответствовать вашим потребностям:

var Ids = ['123', '456', '789', '789']; 
var Names = ['jack', 'jack', 'peter', 'peter']; 
var Unique_Ids = []; 
var Unique_Names = []; 
for(i=0; i<Ids.length; i++) { Unique_Names.push(Names[i]); Unique_Ids.push(Ids[i]); } //Create 2 new arrays without polluting the old ones 
var idToCompare; 
for(id=0; id<Unique_Ids.length; id++) { 
    idToCompare = Unique_Ids[id]; 
    for(id2=id+1; id2<Unique_Ids.length; id2++) { 
     if(Unique_Ids[id] == Unique_Ids[id2]) { 
      Unique_Ids.splice(id2, 1); 
      Unique_Names.splice(id2, 1); 
      id2--; 
     } 
    } 
} 

Сначала он создает копию каждого из массивов. Это будет проходить через каждый элемент вашего массива Unique_Ids, проверяя, есть ли дубликат, а затем, если это так, удалите его из обоих Unique_Ids и Unique_Names. Вероятно, это будет довольно медленно, если сделать это на очень больших массивах.

Как просили в комментариях, вот это решение, которое изменит исходные массивы:

var Ids = ['123', '456', '789', '789']; 
var Names = ['jack', 'jack', 'peter', 'peter']; 
var idToCompare; 
for(id=0; id<Ids.length; id++) { 
    idToCompare = Ids[id]; 
    for(id2=id+1; id2<Ids.length; id2++) { 
     if(Ids[id] == Ids[id2]) { 
      Ids.splice(id2, 1); 
      Names.splice(id2, 1); 
      id2--; 
     } 
    } 
} 
+0

он хочет новые массивы для вывода –

+0

Я обновил ответ, чтобы включить создание 2 новых массивов – millerbr

+0

Хорошо .. но, пожалуйста, добавьте предыдущее решение снова к своему решению .. Я имею в виду, пожалуйста, оба они .. – stack

1

Вот утомительный способ сделать это

var Ids = ['123', '456', '789', '789']; 
var Names = ['jack', 'jack', 'peter', 'peter']; 

var i; 
var t = {}; 
var unique_ids = []; 
var unique_names = []; 

for(i = 0; i < Ids.length; i += 1) { 
    var id = Ids[i]; 
    var name = Names[i]; 
    t[id] = t[id] || name; 
} 
for (i in t) { 
    if (t.hasOwnProperty(i)) { 
     unique_ids.push(i); 
     unique_names.push(t[i]); 
    } 
} 
+0

'in' is' in' in 'for ... in' - [docs] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...in) ... не волнуйтесь, IE7 справится с этим, он был в javascript с июня 1997 года –

+0

А ... Отличный ... – stack

+0

Посмотрите, это решение очень хорошее .. только для моей информации, пожалуйста, покажите мне, как я могу это сделать без новых массивов? Я имею в виду применение изменений в 'Ids' и 'Имена'? – stack

1

Используйте этот небольшой код:

var Ids = ['123', '456', '789', '789']; 
var Names = ['jack', 'jack', 'peter', 'peter']; 
var uniqueIds = []; 
var uniqueNames = []; 
var i=0; 
$.each(Ids, function(i, el){ 
    if($.inArray(el, uniqueIds) === -1) { 
     uniqueIds.push(el); 
     uniqueNames.push(Names[i]); 
     console.log(Names[i]); 
     i++; 

     } 
}); 
+0

Ну, это не работает для меня https://jsfiddle.net/xqh06wvj/1/ – stack

+0

это сработало, но вам нужно импортировать jquery –

+0

Так почему бы не отметить правильный ответ –

0

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

var Ids = ['123', '456', '789', '789']; 
var Names = ['jack', 'jack', 'peter', 'peter']; 
var Unique_Ids = []; 
var Unique_Names = []; 
var IndexString=''; 
for(var i=0;i<Ids.length;i++){ 
    if(IndexString.indexOf('|'+Ids[i]+'|')==-1){ 
     Unique_Ids.push(Ids[i]); 
     Unique_Names.push(Names[i]); 
     IndexString+='|'+Ids[i]+'|' 
    } 
} 
+0

Спасибо .. Но я упомянул: * I не нужно решение, содержащее этот метод 'indexOf()' – stack

+0

. Если вы не найдете лучшего ответа, это простое исправление: http://coding-journal.com/array-indexof-in-internet -explorer-9/ –

+0

Я также редактировал, чтобы использовать indexOf для строки вместо массива, которая поддерживается в проводнике. –

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