66

2つの配列を比較して差を返すための最速/最良の方法は何ですか?array_diffPHPとよく似ています。簡単な関数はありますか、それとも経由で作成する必要がありますeach()か?またはforeachループ?

4

10 に答える 10

147

これは古い質問だと思いますが、このちょっとしたコツを共有したいと思いました。

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

diff今は入っていold_arrayないものが含まれていますnew_array

于 2013-03-13T12:51:29.227 に答える
70

作業デモ http://jsfiddle.net/u9xES/

良いリンク(Jqueryドキュメント):http ://docs.jquery.com/Main_Page {ここでAPIを検索または読み取ることができます}

JQueryでそれを行うことを検討している場合、これがお役に立てば幸いです。

最後のアラートは、珍しい要素配列の配列、つまり2つの配列の違いを促します。

私が何かを逃したかどうかを知ってください、乾杯!

コード

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 
于 2012-06-07T08:05:15.287 に答える
9

アンダースコアを次のように使用します:

_.difference(array1,array2)
于 2014-02-27T14:01:41.207 に答える
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;
};
于 2012-06-07T08:23:47.203 に答える
3
/** 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"!

これはすべての場合に機能し、上記の方法の問題を回避します。お役に立てば幸いです。

于 2015-08-30T03:12:30.923 に答える
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;
}
于 2013-08-30T10:40:20.257 に答える
2

このようにして、最初の配列が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));
于 2014-01-13T12:03:36.293 に答える
2

短いバージョンは次のようになります。

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

結果:

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

["c", "d"]
于 2019-03-11T14:45:54.140 に答える
1

このような配列操作は、jQueryの最大の強みではありません。Underscorejsなどのライブラリ、特に差分関数を検討する必要があります。

于 2012-06-07T07:52:02.417 に答える
1

これは、並べ替えられていない配列、double値、異なる順序と長さで機能し、array1、array2、またはその両方からフィルターされた値を提供します。

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 ]
于 2016-11-16T12:30:05.543 に答える