2012-06-07 2 views
52

Какой самый быстрый/лучший способ сравнить два массива и вернуть разницу? Очень похоже на array_diff в PHP. Есть ли простая функция, или мне нужно будет создать ее через each()? или цикл foreach?Сравнить 2 массива, которые возвращают разницу

+0

Hiya man, я считаю, вы можете использовать 'inArray' и заполнить разницу между 2 массивами; Я вложил в нее рабочую демоверсию, надеюсь, что это поможет B-) –

+0

дубликат http://stackoverflow.com/questions/1187518/javascript-array-difference (даже если он уже был где-то там где-то связан) – cregox

+0

You вероятно, хочу [этот ответ из прошлого вопроса SO] (http://stackoverflow.com/a/4026828/304588). Он основывается на прототипе Array. –

ответ

60

Работа демоhttp://jsfiddle.net/u9xES/

Хорошей ссылка (Jquery Документация): http://docs.jquery.com/Main_Page {вы можете искать или читать API, здесь}

Надеется, что это поможет вам, если вы хотите сделать это в JQuery.

Предупреждение в конце вызывает массив необычного элемента Array i.e. Разница между двумя массивами.

Пожалуйста, дайте мне знать, пропустил ли я что-нибудь, ура!

Код

var array1 = [1, 2, 3, 4, 5, 6]; 
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
var difference = []; 

jQuery.grep(array2, function(el) { 
     if (jQuery.inArray(el, array1) == -1) difference.push(el); 
}); 

alert(" the difference is " + difference);​ // Changed variable name 
+8

Этот метод классный, но должен учитывать случай, если длина массива меньше, чем array1 –

+14

Более элегантно: просто 'разность = $ .grep (a1, function (x) {return $ .inArray (x, a2) <0}) ' –

+2

Отличный ответ. Однако хотелось бы указать, что вы используете '.grep' как' .each'; должен быть 'difference = $ .grep (array2, function (el) {return $ .inArray (el, array1) == -1;})' – PeterKA

1

Операции с массивами, как это не самая сильная точка jQuery. Вы должны рассмотреть библиотеку, такую ​​как Underscorejs, в частности функцию разности.

3
var arrayDiff = function (firstArr, secondArr) { 
    var i, o = [], fLen = firstArr.length, sLen = secondArr.length, len; 


    if (fLen > sLen) { 
     len = sLen; 
    } else if (fLen < sLen) { 
     len = fLen; 
    } else { 
     len = sLen; 
    } 
    for (i=0; i < len; i++) { 
     if (firstArr[i] !== secondArr[i]) { 
      o.push({idx: i, elem1: firstArr[i], elem2: secondArr[i]}); //idx: array index 
     } 
    } 

    if (fLen > sLen) { // first > second 
     for (i=sLen; i< fLen; i++) { 
      o.push({idx: i, 0: firstArr[i], 1: undefined}); 
     } 
    } else if (fLen < sLen) { 
     for (i=fLen; i< sLen; i++) { 
      o.push({idx: i, 0: undefined, 1: secondArr[i]}); 
     } 
    }  

    return o; 
}; 
127

Я знаю, что это старый вопрос, но я думал, что я разделю эту маленькую хитрость.

var diff = $(old_array).not(new_array).get(); 

diff теперь содержит то, что было в old_array, что не в new_array

+2

короткий и сладкий .. просто как мне нравится .. Я использовал это с '$ .merge()' для конкатенации различий в определенном конкретном порядке ... – kingkode

+1

будет работать, если массив содержит объекты? Я пытаюсь сравнить объекты в двух массивах – Batman

+2

Вот сценарий. Это отлично работает для '$ (['h', 'h', 'h', 'h', 'h']). Not ($ ([" a "," a "," a "]))' но для массива типа '$ (['h', 'h', 'h', 'h', 'h']). not ($ ([" a "," a "," a "," h "]))' (УВЕДОМЛЕНИЕ о последнем «h» в массиве), он возвращает пустой массив. Разница не возвращается. Следовательно, он неисправен. –

2

, если вы хотите, чтобы сравнить порядок ответа вы можете продлить ответ на что-то вроде этого:

Array.prototype.compareTo = function (array2){ 
    var array1 = this; 
    var difference = []; 
    $.grep(array2, function(el) { 
     if ($.inArray(el, array1) == -1) difference.push(el); 
    }); 
    if(difference.length === 0){ 
     var $i = 0; 
     while($i < array1.length){ 
      if(array1[$i] !== array2[$i]){ 
       return false; 
      } 
      $i++; 
     } 
     return true; 
    } 
    return false; 
} 
2

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

var arr1 = [1, 2, 3, 4, 5, 6,10], 
    arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function array_diff(array1, array2){ 
    var difference = $.grep(array1, function(el) { return $.inArray(el,array2) < 0}); 
    return difference.concat($.grep(array2, function(el) { return $.inArray(el,array1) < 0}));; 
} 

console.log(array_diff(arr1, arr2)); 
8

использование подчеркивания, как:

_.difference(array1,array2) 
+1

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – AlSki

+2

@AlSki дает ответ на заданный вопрос! сравнивает два массива и возвращает diff. –

+1

@ anurag_29 Вопрос состоял в том, как это сделать с помощью jQuery, а не с подчеркиванием. – reergymerej

2
/** SUBTRACT ARRAYS **/ 
function subtractarrays(array1, array2){ 
    var difference = []; 
    for(var i = 0; i < array1.length; i++) { 
     if($.inArray(array1[i], array2) == -1) { 
        difference.push(array1[i]); 
     } 
    } 

    return difference; 
} 

Вы можете вызвать функцию в любом месте вашего кода.

var I_like = ["love", "sex", "food"]; 
var she_likes = ["love", "food"]; 

alert("what I like and she does't like is: " + subtractarrays(I_like, she_likes)); //returns "Naughty"! 

Это работает во всех случаях и позволяет избежать проблем в вышеприведенных методах. Надеюсь, это поможет!

0

Это должно работать с несортированными массивами, двойными значениями и разными порядками и длиной, предоставляя вам отфильтрованные значения формы array1, array2 или both.

function arrayDiff(arr1, arr2) { 
    var diff = {}; 

    diff.arr1 = arr1.filter(function(value) { 
     if (arr2.indexOf(value) === -1) { 
      return value; 
     } 
    }); 

    diff.arr2 = arr2.filter(function(value) { 
     if (arr1.indexOf(value) === -1) { 
      return value; 
     } 
    }); 

    diff.concat = diff.arr1.concat(diff.arr2); 

    return diff; 
}; 

var firstArray = [1,2,3,4]; 
var secondArray = [4,6,1,4]; 

console.log(arrayDiff(firstArray, secondArray)); 
console.log(arrayDiff(firstArray, secondArray).arr1); 
// => [ 2, 3 ] 
console.log(arrayDiff(firstArray, secondArray).concat); 
// => [ 2, 3, 6 ] 
0

Вместо того, чтобы тянуть весь Lodash вы можете использовать этот легкий array-diff компонент с открытым исходным кодом.

Пример:

diff([1,2,3], [1,2,3,4,5]) // => [4,5] 

Он работает concating два массива, переданные и фильтрации включены Vals, возвращая массив, представляющий разницу между двумя массивами.

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

  • Нет связанных вопросов^_^