Сравните 2 массива, который возвращает разницу

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

 Tats_innit07 июн. 2012 г., 10:15
Привет человек, я думаю, вы можете использоватьinArray и заполните разницу между двумя массивами; Я вставил рабочую демонстрацию для вас, надеюсь, это поможет B-)
 Richard Neil Ilagan07 июн. 2012 г., 09:48
Вы, вероятно, хотитеthis answer from a past SO question, Он основан на прототипе Array.
 cregox14 мая 2015 г., 20:45
дубликатstackoverflow.com/questions/1187518/javascript-array-difference (даже если это уже было связано где-то там)

Ответы на вопрос(10)

двойными значениями и различными порядками и длиной, давая вам отфильтрованные значения из массивов1, массив2 или обоих.

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 ]

const diff = (a, b) => b.filter((i) => a.indexOf(i) === -1);

результат:

diff(['a', 'b'], ['a', 'b', 'c', 'd']);

["c", "d"]

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

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));

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

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

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

 06 февр. 2014 г., 11:51
@ VishnuNarang Я вполне уверен, что функция PHP array_diff () не является неисправной.
 19 янв. 2014 г., 07:53
это будет работать, если массив содержит объекты? Я пытаюсь сравнить объекты в двух массивах
 06 февр. 2014 г., 08:18
Вот сценарий. Это прекрасно работает для$(['h','h','h','h','h']).not($(["a", "a", "a"])) но для массива как$(['h','h','h','h','h']).not($(["a", "a", "a", "h"])) (Обратите внимание, что последний «h» в массиве) возвращает пустой массив. Разница не возвращается. Следовательно, он неисправен.
 09 окт. 2013 г., 19:17
коротко и сладко .. так же, как мне это нравится .. я использовал это с$.merge() объединить различия в конкретном конкретном порядке ...
 06 февр. 2014 г., 11:50
@VishnuNarang Я думаю, что вы неправильно понимаете некоторые вещи здесь. Во-первых, как работает различие в массивах, а во-вторых, не читая фактический вопрос, заданный ОП. Давайте разберемся с первым недоразумением. Возвращение пустого массива во втором примере - это ТОЧНО правильный результат. Он возвращает то, что было в первом массиве, а не во втором (т.е. ничего). Это и есть «разница» между первым массивом и вторым. Во-вторых, OP запросил функцию jQuery, такую как PHP (array_diff). Это оно! Ваш пример, выполняемый через функцию PHP array_diff (), также создает пустой массив

вы можете расширить ответ примерно так:

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;
}
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;
};

используйте подчеркивание как:

_.difference(array1,array2)
 25 июн. 2015 г., 06:55
@AlSki Когда ответ публикуется ГОДАМИ позже, думаю, уместно опубликовать ответ, который предполагает использование библиотеки, отличной от заданного вопроса, потому что это возможный ответ на вопрос - не зная его. так или иначе, если ОП или другие лица, посещающие вопрос спустя годы, знают о библиотеке.
 31 мар. 2015 г., 22:46
@ anurag_29 Вопрос был в том, как сделать это с помощью jQuery, а не в подчеркивании.
 27 февр. 2014 г., 15:22
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
 28 февр. 2014 г., 14:31
@AlSki дает ответ на заданный вопрос! сравнивает два массива и возвращает разность

лжны рассмотреть библиотеку, такую как Underscorejs, в частности, функцию разности.

Решение Вопроса

Working demo http://jsfiddle.net/u9xES/

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

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

Предупреждение в конце подсказывает массив редких элементов Array, т. Е. Разницу между двумя массивами.

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

Code

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 
 15 февр. 2013 г., 16:02
Более элегантно: простоdifference = $.grep(a1,function(x) {return $.inArray(x, a2) < 0})
 30 окт. 2012 г., 12:31
Этот способ хорош, но следует рассмотреть случай, если длина array2 меньше, чем array1
 27 авг. 2014 г., 20:59
Отличный ответ. Однако хотелось бы отметить, что вы используете.grep лайк.each; должно бытьdifference = $.grep(array2, function(el) { return $.inArray( el, array1 ) == -1; })
 22 янв. 2016 г., 14:41
Чувак, ты любовь :) Я застрял около 2 дней, и вы ведете меня на другой конец.
 28 авг. 2014 г., 12:38
@ user3558931 Конечно:) Спасибо! Я считаю, что дополнительные вещи были там, чтобы добавить их в новый массив.
/** 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"!

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

 25 авг. 2018 г., 06:05
Спасибо, работает как шарм :)

Ваш ответ на вопрос