Какой самый быстрый/лучший способ сравнить два массива и вернуть разницу? Очень похоже на array_diff в PHP. Есть ли простая функция, или мне придется создать ее через each()? или цикл foreach?
Сравните 2 массива, которые возвращают разницу
Ответ 1
Рабочая демонстрация http://jsfiddle.net/u9xES/
Хорошая ссылка (Документация JQuery): http://docs.jquery.com/Main_Page {вы можете искать или читать API здесь}
Надеюсь, это поможет вам, если вы хотите сделать это в JQuery.
В конце предупреждения выводится массив необычного элемента Array, то есть разница между двумя массивами.
Пожалуйста, дайте мне знать, пропустил ли я что-нибудь, ура!
код
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 
		Ответ 2
Я знаю, что это старый вопрос, но я думал, что поделюсь этим маленьким трюком.
var diff = $(old_array).not(new_array).get();
 diff теперь содержит то, что было в old_array, которое не находится в new_array
Ответ 3
используйте подчеркивание как:
_.difference(array1,array2)
		Ответ 4
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;
};
		Ответ 5
если вы также хотите сравнить порядок ответа, вы можете продлить ответ на что-то вроде этого:
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;
    } else {
        return false;
    }
}
		Ответ 6
Таким образом, вам не нужно беспокоиться о том, что первый массив меньше второго.
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));
		Ответ 7
/** 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"!
Это работает во всех случаях и позволяет избежать проблем в вышеприведенных методах. Надеюсь, что это поможет!
Ответ 8
Операции массива, подобные этому, не являются самой сильной точкой jQuery. Вы должны рассмотреть библиотеку, такую как Underscorejs, в частности разностную функцию.
Ответ 9
Это должно работать с несортированными массивами, двойными значениями и разными порядками и длиной, давая вам отфильтрованные значения формы 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 ]
		Ответ 10
Вместо того, чтобы тянуть весь Lodash, вы можете использовать этот легкий массив-diff компонент с открытым исходным кодом.
Пример:
diff([1,2,3], [1,2,3,4,5]) // => [4,5]
Он работает путем согласования двух переданных массивов и фильтрации включенных vals, возвращая массив, представляющий разницу между двумя массивами.