2014-09-16 3 views
0

Я уверен, что это очень просто (я новичок!), Но я не смог найти решение.Как сравнить два списка - установить разницу в JavaScript

Я хотел бы импортировать два массива из .csv-файлов, а затем сравнить их и вернуть значения, которые появляются в List1, и НЕ относятся к List2. Итак List1 минус List2 = мой результат.

List1 может выглядеть так: 100,200,300,400 и List2 100,200. Тогда я хотел бы вернуть 300 400 человек.

(Если список 2 должно произойти, чтобы иметь некоторые значения, которые не находятся в списке 1, я бы хотел, чтобы запустить в любом случае и не выдаст ошибку, но я полагаю, что это не так?)

Спасибо заранее за любые советы/указатели или код, вы должны быть так добры :-)

+2

Возможный дубликат [Что является самым быстрым или самым элегантным способом вычисления разницы в наборах с использованием массивов Javascript?] (Http://stackoverflow.com/questions/1723168/what-is-the-fastest -or-most-elegant-way-to-compute-a-set-difference-using-javasc) – Vache

+0

Вы хотите скорость или простоту? – dandavis

+0

Определенно простота! Каждый массив будет иметь менее 50 значений. – captchacha

ответ

0

Допустим, у вас есть 2 строки с , значений, разделенных как

var a= "100, 200, 400"; 
var b = "100, 200, 300"; 

вы можете сцепить значения, как, используя String.split конвертировать их в массив:

var items = (a +","+ b).split(','); 

И тогда можно сделать несколькими способами, один использует Array.prototype.reduce как

items.reduce(function(a,c){ var count = a.filter(function(item){ return item ===c; }).length; if(count<1) a.push(c); return a;},[]); 
0

Это, кажется, работает:

var array1 = [100,200,300,400]; 
var array2 = [200,100,400]; 
function array_diff(arr1,arr2) 
{ 
    var x = Math.max(arr1.length,arr2.length); 
    for(var i = 0; i < x; i++) 
    { 
     if(typeof arr1[i] !== 'undefined' && arr2.indexOf(arr1[i]) !== -1) 
      arr1.splice(i,1); 
     if(typeof arr2[i] !== 'undefined' && arr1.indexOf(arr2[i]) !== -1) 
      arr1.splice(arr1.indexOf(arr2[i]),1); 
    } 
    return arr1; 
} 
console.log(array_diff(array1,array2)); 

Я пытался избежать использования Array.prototype.filter и Array.prototype.reduce, потому что они несовместимы со старыми браузерами. Насколько я знаю, Array.prototype.splice имеет лучшую поддержку.

Если вы ищете прирост скорости, я могу ошибаться, но, я думаю, что сортировка массивов заранее ускорит indexOf.

http://jsfiddle.net/0tcyam2f/1/

0

Спасибо за ваши ответы!

Я боюсь, что этот код немного по сравнению с моим пониманием, поэтому я просто проверил различные варианты, и тот, который, кажется, дает желаемый результат без сообщений об ошибках, является одним из What is the fastest or most elegant way to compute a set difference using Javascript arrays?, как справедливо указано Ваче, то есть:

A = [100,200,300]; 
B = [100,200,500]; 

diff_set = { 
    ar : {}, 
    diff : Array(), 
    remove_set : function(a) { ar = a; return this; }, 
    remove: function (el) { 
     if(ar.indexOf(el)<0) this.diff.push(el); 
    } 
}; 

A.forEach(diff_set.remove_set(B).remove,diff_set); 
C = diff_set.diff; 

Сообщение от Xavi Ivars

Спасибо за предоставление ответов !! Очень ценится :-)