簡體   English   中英

如何得到JavaScript中兩個arrays的區別?

[英]How to get the difference between two arrays in JavaScript?

有沒有辦法返回JavaScript中兩個arrays的差值?

例如:

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

// need ["c", "d"]

使用 ES7 有更好的方法:


路口<\/strong>

 let intersection = arr1.filter(x => arr2.includes(x));

 Array.prototype.diff = function(a) { return this.filter(function(i) {return a.indexOf(i) < 0;}); }; \/\/\/\/\/\/\/\/\/\/\/\/\/\/ \/\/ Examples \/\/ \/\/\/\/\/\/\/\/\/\/\/\/\/\/ const dif1 = [1,2,3,4,5,6].diff( [3,4,5] ); console.log(dif1); \/\/ => [1, 2, 6] const dif2 = ["test1", "test2","test3","test4","test5","test6"].diff(["test1","test2","test3","test4"]); console.log(dif2); \/\/ => ["test5", "test6"]<\/code><\/pre>

注意<\/strong>.indexOf()<\/code>和.filter()<\/code>在 IE9 之前不可用。

"

這個答案是在 2009 年寫的,所以有點過時了,對於理解這個問題也很有教育意義。 我今天使用的最佳解決方案是

let difference = arr1.filter(x => !arr2.includes(x));

(此處歸功於其他作者)

我假設您正在比較一個普通數組。 如果沒有,則需要將for循環更改為for .. in循環。

 function arr_diff (a1, a2) { var a = [], diff = []; for (var i = 0; i < a1.length; i++) { a[a1[i]] = true; } for (var i = 0; i < a2.length; i++) { if (a[a2[i]]) { delete a[a2[i]]; } else { a[a2[i]] = true; } } for (var k in a) { diff.push(k); } return diff; } console.log(arr_diff(['a', 'b'], ['a', 'b', 'c', 'd'])); console.log(arr_diff("abcd", "abcde")); console.log(arr_diff("zxc", "zxc"));

這是迄今為止使用 jQuery 獲得您正在尋找的結果的最簡單方法:

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

Underscore<\/a> (或其替代品Lo-Dash<\/a> )中的差異方法也可以做到這一點:

(R)eturns the values from array that are not present in the other arrays

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]

純 JavaScript

“差異”有兩種可能的解釋。 我會讓你選擇你想要的。 假設你有:

var a1 = ['a', 'b'     ];
var a2 = [     'b', 'c'];
  1. 如果你想得到['a'] ,使用這個函數:

     function difference(a1, a2) { var result = []; for (var i = 0; i < a1.length; i++) { if (a2.indexOf(a1[i]) === -1) { result.push(a1[i]); } } return result; }
  2. 如果要獲取['a', 'c'] (包含在a1a2中的所有元素,但不能同時包含兩者 - 所謂的對稱差異),請使用此函數:

     function symmetricDifference(a1, a2) { var result = []; for (var i = 0; i < a1.length; i++) { if (a2.indexOf(a1[i]) === -1) { result.push(a1[i]); } } for (i = 0; i < a2.length; i++) { if (a1.indexOf(a2[i]) === -1) { result.push(a2[i]); } } return result; }

Lodash / 下划線

如果您使用 lodash,您可以使用_.difference(a1, a2) (上面的案例 1)或_.xor(a1, a2) (案例 2)。

如果您使用的是 Underscore.js,則可以將_.difference(a1, a2)函數用於案例 1。

ES6 Set,用於非常大的數組

上面的代碼適用於所有瀏覽器。 然而,對於超過 10,000 個項目的大型數組,它變得相當慢,因為它具有 O(n²) 復雜度。 在許多現代瀏覽器上,我們可以利用 ES6 Set對象來加快速度。 Lodash 在可用時自動使用Set 如果您不使用 lodash,請使用以下實現,靈感來自Axel Rauschmayer 的博客文章

function difference(a1, a2) {
  var a2Set = new Set(a2);
  return a1.filter(function(x) { return !a2Set.has(x); });
}

function symmetricDifference(a1, a2) {
  return difference(a1, a2).concat(difference(a2, a1));
}

筆記

如果您關心-0、+0、NaN或稀疏數組,所有示例的行為都可能令人驚訝或不明顯。 (對於大多數用途,這無關緊要。)

ES6 中一種更簡潔的方法是以下解決方案。

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

要獲得對稱差異,您需要以兩種方式比較數組(或者在多個數組的情況下以所有方式)

在此處輸入圖像描述


ES7(ECMAScript 2016)

// diff between just two arrays:
function arrayDiff(a, b) {
    return [
        ...a.filter(x => !b.includes(x)),
        ...b.filter(x => !a.includes(x))
    ];
}

// diff between multiple arrays:
function arrayDiff(...arrays) {
    return [].concat(...arrays.map( (arr, i) => {
        const others = arrays.slice(0);
        others.splice(i, 1);
        const unique = [...new Set([].concat(...others))];
        return arr.filter(x => !unique.includes(x));
    }));
}

ES6(ECMAScript 2015)

// diff between just two arrays:
function arrayDiff(a, b) {
    return [
        ...a.filter(x => b.indexOf(x) === -1),
        ...b.filter(x => a.indexOf(x) === -1)
    ];
}

// diff between multiple arrays:
function arrayDiff(...arrays) {
    return [].concat(...arrays.map( (arr, i) => {
        const others = arrays.slice(0);
        others.splice(i, 1);
        const unique = [...new Set([].concat(...others))];
        return arr.filter(x => unique.indexOf(x) === -1);
    }));
}

ES5 (ECMAScript 5.1)

// diff between just two arrays:
function arrayDiff(a, b) {
    var arrays = Array.prototype.slice.call(arguments);
    var diff = [];

    arrays.forEach(function(arr, i) {
        var other = i === 1 ? a : b;
        arr.forEach(function(x) {
            if (other.indexOf(x) === -1) {
                diff.push(x);
            }
        });
    })

    return diff;
}

// diff between multiple arrays:
function arrayDiff() {
    var arrays = Array.prototype.slice.call(arguments);
    var diff = [];

    arrays.forEach(function(arr, i) {
        var others = arrays.slice(0);
        others.splice(i, 1);
        var otherValues = Array.prototype.concat.apply([], others);
        var unique = otherValues.filter(function (x, j) { 
            return otherValues.indexOf(x) === j; 
        });
        diff = diff.concat(arr.filter(x => unique.indexOf(x) === -1));
    });
    return diff;
}

例子:

// diff between two arrays:
const a = ['a', 'd', 'e'];
const b = ['a', 'b', 'c', 'd'];
arrayDiff(a, b); // (3) ["e", "b", "c"]

// diff between multiple arrays
const a = ['b', 'c', 'd', 'e', 'g'];
const b = ['a', 'b'];
const c = ['a', 'e', 'f'];
arrayDiff(a, b, c); // (4) ["c", "d", "g", "f"]

對象數組之間的區別

function arrayDiffByKey(key, ...arrays) {
    return [].concat(...arrays.map( (arr, i) => {
        const others = arrays.slice(0);
        others.splice(i, 1);
        const unique = [...new Set([].concat(...others))];
        return arr.filter( x =>
            !unique.some(y => x[key] === y[key])
        );
    }));
}

例子:

const a = [{k:1}, {k:2}, {k:3}];
const b = [{k:1}, {k:4}, {k:5}, {k:6}];
const c = [{k:3}, {k:5}, {k:7}];
arrayDiffByKey('k', a, b, c); // (4) [{k:2}, {k:4}, {k:6}, {k:7}]

在這種情況下,您可以使用Set 它針對這種操作(聯合、交叉、差異)進行了優化。

確保它適用於您的案例,一旦它不允許重復。

var a = new JS.Set([1,2,3,4,5,6,7,8,9]);
var b = new JS.Set([2,4,6,8]);

a.difference(b)
// -> Set{1,3,5,7,9}
function diff(a1, a2) {
  return a1.concat(a2).filter(function(val, index, arr){
    return arr.indexOf(val) === arr.lastIndexOf(val);
  });
}

合並兩個數組,唯一值只會出現一次,因此 indexOf() 將與 lastIndexOf() 相同。

隨着帶有集合和 splat 運算符的 ES6 的到來(當時僅在 Firefox 中有效,請檢查兼容性表),您可以編寫以下一行:

var a = ['a', 'b', 'c', 'd'];
var b = ['a', 'b'];
var b1 = new Set(b);
var difference = [...new Set(a.filter(x => !b1.has(x)))];

這將導致[ "c", "d" ]

要從另一個數組中減去一個數組,只需使用以下代碼段:

var a1 = ['1','2','3','4','6'];
var a2 = ['3','4','5'];

var items = new Array();

items = jQuery.grep(a1,function (item) {
    return jQuery.inArray(item, a2) < 0;
});

它將返回 ['1,'2','6'] ,它們是第一個數組中不存在於第二個數組中的項。

因此,根據您的問題示例,以下代碼是確切的解決方案:

var array1 = ["test1", "test2","test3", "test4"];
var array2 = ["test1", "test2","test3","test4", "test5", "test6"];

var _array = new Array();

_array = jQuery.grep(array2, function (item) {
     return jQuery.inArray(item, array1) < 0;
});

ES2015 的函數式方法<\/h2>

計算兩個數組之間的difference<\/code>是Set<\/code>操作之一。 該術語已經表明應該使用本機Set<\/code>類型,以提高查找速度。 無論如何,當您計算兩組之間的差異時,有三種排列:

這是反映這些排列的功能解決方案。

difference<\/code> : <\/h3>

 \/\/ small, reusable auxiliary functions const apply = f => x => f(x); const flip = f => y => x => f(x) (y); const createSet = xs => new Set(xs); const filter = f => xs => xs.filter(apply(f)); \/\/ left difference const differencel = xs => ys => { const zs = createSet(ys); return filter(x => zs.has(x) ? false : true ) (xs); }; \/\/ mock data const xs = [1,2,2,3,4,5]; const ys = [0,1,2,3,3,3,6,7,8,9]; \/\/ run the computation console.log( differencel(xs) (ys) );<\/code><\/pre>

正確difference<\/code> :<\/h3>

differencer<\/code>是微不足道的。 這只是與翻轉參數的differencel<\/code> 。 為方便起見,您可以編寫一個函數: const differencer = flip(differencel)<\/code> 。 就這樣!

對稱difference<\/code> :<\/h3>

現在我們有了左右一個,實現對稱difference<\/code>也變得微不足道:

我想這個例子是了解函數式編程意味着什么的一個很好的起點:

使用可以以多種不同方式插入在一起的構建塊進行編程。<\/strong>

解決問題的另一種方法

function diffArray(arr1, arr2) {
    return arr1.concat(arr2).filter(function (val) {
        if (!(arr1.includes(val) && arr2.includes(val)))
            return val;
    });
}

diffArray([1, 2, 3, 7], [3, 2, 1, 4, 5]);    // return [7, 4, 5]

此外,您可以使用箭頭函數語法:

const diffArray = (arr1, arr2) => arr1.concat(arr2)
    .filter(val => !(arr1.includes(val) && arr2.includes(val)));

diffArray([1, 2, 3, 7], [3, 2, 1, 4, 5]);    // return [7, 4, 5]

使用indexOf()<\/code>的解決方案適用於小型數組,但隨着它們的長度增長,算法的性能接近O(n^2)<\/code> 。 這是一個解決方案,通過使用對象作為關聯數組將數組條目存儲為鍵,對於非常大的數組表現更好; 它還自動消除重復條目,但僅適用於字符串值(或可以安全存儲為字符串的值):

function arrayDiff(a1, a2) {
  var o1={}, o2={}, diff=[], i, len, k;
  for (i=0, len=a1.length; i<len; i++) { o1[a1[i]] = true; }
  for (i=0, len=a2.length; i<len; i++) { o2[a2[i]] = true; }
  for (k in o1) { if (!(k in o2)) { diff.push(k); } }
  for (k in o2) { if (!(k in o1)) { diff.push(k); } }
  return diff;
}

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];
arrayDiff(a1, a2); // => ['c', 'd']
arrayDiff(a2, a1); // => ['c', 'd']

Joshaven Potter 的上述回答很棒。 但它返回數組 B 中不在數組 C 中的元素,但反之則不然。 例如,如果var a=[1,2,3,4,5,6].diff( [3,4,5,7]);<\/code> 然后它將輸出: ==> [1,2,6]<\/code> ,但不是<\/strong>[1,2,6,7]<\/code> ,這是兩者之間的實際差異。 您仍然可以使用上面的 Potter 代碼,但也只需向后重做一次比較:

Array.prototype.diff = function(a) {
    return this.filter(function(i) {return !(a.indexOf(i) > -1);});
};

////////////////////  
// Examples  
////////////////////

var a=[1,2,3,4,5,6].diff( [3,4,5,7]);
var b=[3,4,5,7].diff([1,2,3,4,5,6]);
var c=a.concat(b);
console.log(c);

一班輪<\/h3>

 const unique = (a) => [...new Set(a)]; const uniqueBy = (x,f)=>Object.values(x.reduce((a,b)=>((a[f(b)]=b),a),{})); const intersection = (a, b) => a.filter((v) => b.includes(v)); const diff = (a, b) => a.filter((v) => !b.includes(v)); const symDiff = (a, b) => diff(a, b).concat(diff(b, a)); const union = (a, b) => diff(a, b).concat(b); const a = unique([1, 2, 3, 4, 5, 5]); console.log(a); const b = [4, 5, 6, 7, 8]; console.log(intersection(a, b), diff(a, b), symDiff(a, b), union(a, b)); console.log(uniqueBy( [ { id: 1, name: "abc" }, { id: 2, name: "xyz" }, { id: 1, name: "abc" }, ], (v) => v.id ));<\/code><\/pre>

"

帶有 JavaScript 過濾功能的非常簡單的解決方案:

Array.prototype.difference = function(e) {
    return this.filter(function(i) {return e.indexOf(i) < 0;});
};

eg:- 

[1,2,3,4,5,6,7].difference( [3,4,5] );  
 => [1, 2, 6 , 7]

這個怎么樣:

Array.prototype.contains = function(needle){
  for (var i=0; i<this.length; i++)
    if (this[i] == needle) return true;

  return false;
} 

Array.prototype.diff = function(compare) {
    return this.filter(function(elem) {return !compare.contains(elem);})
}

var a = new Array(1,4,7, 9);
var b = new Array(4, 8, 7);
alert(a.diff(b));

所以這樣你就可以做array1.diff(array2)來獲得他們的差異(雖然算法的時間復雜度很可怕 - O(array1.length x array2.length) 我相信)

function diffArray(arr1, arr2) {
  var newArr = arr1.concat(arr2);
  return newArr.filter(function(i){
    return newArr.indexOf(i) == newArr.lastIndexOf(i);
  });
}
  • 純 JavaScript 解決方案(無庫)<\/li>
  • 與舊瀏覽器兼容(不使用filter<\/code> )<\/li>
  • O(n^2)<\/li>
  • 可選的fn<\/code>回調參數,可讓您指定如何比較數組項<\/li><\/ul>

     function diff(a, b, fn){ var max = Math.max(a.length, b.length); d = []; fn = typeof fn === 'function' ? fn : false for(var i=0; i < max; i++){ var ac = i < a.length ? a[i] : undefined bc = i < b.length ? b[i] : undefined; for(var k=0; k < max; k++){ ac = ac === undefined || (k < b.length && (fn ? fn(ac, b[k]) : ac == b[k])) ? undefined : ac; bc = bc === undefined || (k < a.length && (fn ? fn(bc, a[k]) : bc == a[k])) ? undefined : bc; if(ac == undefined && bc == undefined) break; } ac !== undefined && d.push(ac); bc !== undefined && d.push(bc); } return d; } alert( "Test 1: " + diff( [1, 2, 3, 4], [1, 4, 5, 6, 7] ).join(', ') + "\\nTest 2: " + diff( [{id:'a',toString:function(){return this.id}},{id:'b',toString:function(){return this.id}},{id:'c',toString:function(){return this.id}},{id:'d',toString:function(){return this.id}}], [{id:'a',toString:function(){return this.id}},{id:'e',toString:function(){return this.id}},{id:'f',toString:function(){return this.id}},{id:'d',toString:function(){return this.id}}], function(a, b){ return a.id == b.id; } ).join(', ') );<\/code><\/pre>

    "

使用http://phrogz.net/JS/ArraySetMath.js你可以:

var array1 = ["test1", "test2","test3", "test4"];
var array2 = ["test1", "test2","test3","test4", "test5", "test6"];

var array3 = array2.subtract( array1 );
// ["test5", "test6"]

var array4 = array1.exclusion( array2 );
// ["test5", "test6"]

要查找沒有重復的 2 個數組的差異

function difference(arr1, arr2){

  let setA = new Set(arr1);
  let differenceSet = new Set(arr2.filter(ele => !setA.has(ele)));
  return [...differenceSet ];

}

1. difference([2,2,3,4],[2,3,3,4])將返回[]

2. difference([1,2,3],[4,5,6])將返回[4,5,6]

3. difference([1,2,3,4],[1,2])將返回[]

4. difference([1,2],[1,2,3,4])將返回[3,4]

注意:上述解決方案要求您始終將較大的數組作為第二個參數發送。 要找到絕對差異,您需要首先找到兩者中較大的數組,然后對它們進行處理。

要找到 2 個沒有重復的數組的絕對差異

function absDifference(arr1, arr2){

  const {larger, smaller} = arr1.length > arr2.length ? 
  {larger: arr1, smaller: arr2} : {larger: arr2, smaller: arr1}
  
  let setA = new Set(smaller);
  let absDifferenceSet = new Set(larger.filter(ele => !setA.has(ele)));
  return [...absDifferenceSet ];

}

1. absDifference([2,2,3,4],[2,3,3,4])將返回[]

2. absDifference([1,2,3],[4,5,6])將返回[4,5,6]

3. absDifference([1,2,3,4],[1,2])將返回[3,4]

4. absDifference([1,2],[1,2,3,4])將返回[3,4]

請注意兩個解決方案中的示例 3

您可以使用 underscore.js: http ://underscorejs.org/#intersection

您需要數組的方法:

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]

這是有效的:基本上合並兩個數組,查找重復項並將未重復的內容推送到一個新數組中,這就是區別。

我想要一個類似的函數,它接收一個舊數組和一個新數組,並給我一個添加項數組和一個刪除項數組,我希望它高效(所以沒有 .contains!)。

您可以在這里使用我提出的解決方案:http: //jsbin.com/osewu3/12

任何人都可以看到該算法的任何問題/改進嗎? 謝謝!

代碼清單:

function diff(o, n) {
  // deal with empty lists
  if (o == undefined) o = [];
  if (n == undefined) n = [];

  // sort both arrays (or this won't work)
  o.sort(); n.sort();

  // don't compare if either list is empty
  if (o.length == 0 || n.length == 0) return {added: n, removed: o};

  // declare temporary variables
  var op = 0; var np = 0;
  var a = []; var r = [];

  // compare arrays and add to add or remove lists
  while (op < o.length && np < n.length) {
      if (o[op] < n[np]) {
          // push to diff?
          r.push(o[op]);
          op++;
      }
      else if (o[op] > n[np]) {
          // push to diff?
          a.push(n[np]);
          np++;
      }
      else {
          op++;np++;
      }
  }

  // add remaining items
  if( np < n.length )
    a = a.concat(n.slice(np, n.length));
  if( op < o.length )
    r = r.concat(o.slice(op, o.length));

  return {added: a, removed: r}; 
}

\/\/es6 方法

function diff(a, b) {
  var u = a.slice(); //dup the array
  b.map(e => {
    if (u.indexOf(e) > -1) delete u[u.indexOf(e)]
    else u.push(e)   //add non existing item to temp array
  })
  return u.filter((x) => {return (x != null)}) //flatten result
}

對稱<\/strong>和線性復雜度<\/strong>。 需要 ES6。

function arrDiff(arr1, arr2) {
    var arrays = [arr1, arr2].sort((a, b) => a.length - b.length);
    var smallSet = new Set(arrays[0]);

    return arrays[1].filter(x => !smallSet.has(x));
}

使用額外的內存來做到這一點。 這樣你就可以用更少的時間復雜度來解決它,O(n) 而不是 o(n*n)。

function getDiff(arr1,arr2){
let k = {};
let diff = []
arr1.map(i=>{
    if (!k.hasOwnProperty(i)) {
        k[i] = 1
    }
}
)
arr2.map(j=>{
    if (!k.hasOwnProperty(j)) {
        k[j] = 1;
    } else {
        k[j] = 2;
    }
}
)
for (var i in k) {
    if (k[i] === 1)
        diff.push(+i)
}
return diff
}
getDiff([4, 3, 52, 3, 5, 67, 9, 3],[4, 5, 6, 75, 3, 334, 5, 5, 6])

littlebit修復最佳答案

function arr_diff(a1, a2)
{
  var a=[], diff=[];
  for(var i=0;i<a1.length;i++)
    a[a1[i]]=a1[i];
  for(var i=0;i<a2.length;i++)
    if(a[a2[i]]) delete a[a2[i]];
    else a[a2[i]]=a2[i];
  for(var k in a)
   diff.push(a[k]);
  return diff;
}

這將考慮當前元素的類型。 b / c當我們制作a [a1 [i]]時,它將其原始值轉換為字符串值,因此我們丟失了實際值。

有沒有辦法返回JavaScript中兩個數組之間的差?

例如:

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

// need ["c", "d"]
var result = [];
var arr1 = [1,2,3,4];
var arr2 = [2,3];
arr1.forEach(function(el, idx) {
    function unEqual(element, index, array) {
        var a = el;
        return (element!=a);
    }
    if (arr2.every(unEqual)) {
        result.push(el);
    };
});
alert(result);

這是受Thinker接受的答案啟發的,但是Thinker的答案似乎是假設數組是集合。 如果數組分別為[ "1", "2" ][ "1", "1", "2", "2" ]它會分崩離析

這些數組之間的差是[ "1", "2" ] 以下解決方案是O(n * n),所以不是理想的解決方案,但是,如果您有大數組,它也比Thinker的解決方案具有內存優勢。

如果您首先要處理場景集,那么Thinker的解決方案肯定會更好。 如果您擁有較新版本的Javascript,並且可以訪問過濾器,則也應使用這些過濾器。 這僅適用於那些不處理集合而使用舊版JavaScript(無論出於何種原因)的人...

if (!Array.prototype.diff) { 
    Array.prototype.diff = function (array) {
        // if the other array is a falsy value, return a copy of this array
        if ((!array) || (!Array.prototype.isPrototypeOf(array))) { 
            return this.slice(0);
        }

        var diff = [];
        var original = this.slice(0);

        for(var i=0; i < array.length; ++i) {
            var index = original.indexOf(array[i]);
            if (index > -1) { 
                original.splice(index, 1);
            } else { 
                diff.push(array[i]);
            }
        }

        for (var i=0; i < original.length; ++i) {
            diff.push(original[i]);
        }
        return diff;
    }
}   

快速解決。 盡管其他人似乎已經發布了相同方法的不同變體。 我不確定這是否最適合大型陣列,但它適用於我不大於 10 或 15 的陣列。

差異b - a

for(var i = 0; i < b.length; i++){
  for(var j = 0; j < a.length; j ++){
    var loc = b.indexOf(a[j]);
    if(loc > -1){
      b.splice(loc, 1);
    }
  }
}

只需比較所有值,然后返回不重復的值的數組。

var main = [9, '$', 'x', 'r', 3, 'A', '#', 0, 1];

var arr0 = ['Z', 9, 'e', '$', 'r'];
var arr1 = ['x', 'r', 3, 'A', '#'];
var arr2 = ['m', '#', 'a', 0, 'r'];
var arr3 = ['$', 1, 'n', '!', 'A'];


Array.prototype.diff = function(arrays) {
    var items = [].concat.apply(this, arguments);
    var diff = [].slice.call(items), i, l, x, pos;

    // go through all items
    for (x = 0, i = 0, l = items.length; i < l; x = 0, i++) {
        // find all positions
        while ((pos = diff.indexOf(items[i])) > -1) {
            // remove item + increase found count
            diff.splice(pos, 1) && x++;
        }
        // if item was found just once, put it back
        if (x === 1) diff.push(items[i]);
    }
    // get all not duplicated items
    return diff;
};

main.diff(arr0, arr1, arr2, arr3).join(''); // returns "Zeman!"

[].diff(main, arr0, arr1, arr2, arr3).join(''); // returns "Zeman!"
function diff(arr1, arr2) {
  var filteredArr1 = arr1.filter(function(ele) {
    return arr2.indexOf(ele) == -1;
  });

  var filteredArr2 = arr2.filter(function(ele) {
    return arr1.indexOf(ele) == -1;
  });
  return filteredArr1.concat(filteredArr2);
}

diff([1, "calf", 3, "piglet"], [1, "calf", 3, 4]); // Log ["piglet",4]

如果數組不是簡單類型,則可以采用上述答案之一:

Array.prototype.diff = function(a) {
        return this.filter(function(i) {return a.map(function(e) { return JSON.stringify(e); }).indexOf(JSON.stringify(i)) < 0;});
    };

此方法適用於復雜對象的數組。

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];
var diff = [];
for (var i in a2) {
   var found = false;
   for (var j in a1) {
      if (a2[i] === a1[j]) found = true;
   }
   if (found === false) diff.push(a2[i]);
}

就那么簡單。 也可以與對象一起使用,檢查對象的一個​​屬性。 喜歡,

if (a2[i].id === a1[j].id) found = true;

類似於 Ian Grainger 的解決方案(但在打字稿中):

function findDiffs(arrayOne: string[], arrayTwo: string[]) {

    let onlyInArrayOne = []
    let onlyInArrayTwo = []
    let share = []
    let [arrayOneCopy, arrayTwoCopy] = [[...arrayOne], [...arrayTwo]]

    arrayOneCopy.sort(); arrayTwoCopy.sort()

    while (arrayOneCopy.length !== 0 && arrayTwoCopy.length !== 0) {
        if (arrayOneCopy[0] == arrayTwoCopy[0]) {
            share.push(arrayOneCopy[0])
            arrayOneCopy.splice(0, 1)
            arrayTwoCopy.splice(0, 1)
        }
        if (arrayOneCopy[0] < arrayTwoCopy[0]) {
            onlyInArrayOne.push(arrayOneCopy[0])
            arrayOneCopy.splice(0, 1)
        }
        if (arrayOneCopy[0] > arrayTwoCopy[0]) {
            onlyInArrayTwo.push(arrayTwoCopy[0])
            arrayTwoCopy.splice(0, 1)
        }
    }
    onlyInArrayTwo = onlyInArrayTwo.concat(arrayTwoCopy)
    onlyInArrayOne = onlyInArrayOne.concat(arrayOneCopy)

    return {
        onlyInArrayOne,
        onlyInArrayTwo,
        share,
        diff: onlyInArrayOne.concat(onlyInArrayTwo)
    }
}

// arrayOne: [ 'a', 'b', 'c', 'm', 'y' ] 
// arrayTwo: [ 'c', 'b', 'f', 'h' ]
//
// Results: 
// { 
//    onlyInArrayOne: [ 'a', 'm', 'y' ],
//    onlyInArrayTwo: [ 'f', 'h' ],
//    share: [ 'b', 'c' ],
//    diff: [ 'a', 'm', 'y', 'f', 'h' ] 
// }

有沒有辦法返回JavaScript中兩個數組之間的差?

例如:

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

// need ["c", "d"]

如果不使用 hasOwnProperty 那么我們有不正確的元素。 例如:

[1,2,3].diff([1,2]); //Return ["3", "remove", "diff"] This is the wrong version

我的版本:

Array.prototype.diff = function(array2)
  {
    var a = [],
        diff = [],
        array1 = this || [];

    for (var i = 0; i < array1.length; i++) {
      a[array1[i]] = true;
    }
    for (var i = 0; i < array2.length; i++) {
      if (a[array2[i]]) {
        delete a[array2[i]];
      } else {
        a[array2[i]] = true;
      }
    }

    for (var k in a) {
      if (!a.hasOwnProperty(k)){
        continue;
      }
      diff.push(k);
    }

    return diff;
  }

使用我目前使用的 jQuery 解決方案做出貢獻:

if (!Array.prototype.diff) {
    Array.prototype.diff = function (a) {
        return $.grep(this, function (i) { return $.inArray(i, a) === -1; });
    }; 
}

CoffeeScript 版本:

diff = (val for val in array1 when val not in array2)

所選答案只對了一半。 您必須以兩種方式比較數組才能得到完整的答案。

const ids_exist = [
   '1234',
   '5678',
   'abcd',
]

const ids_new = [
  '1234',
  '5678',
  'efjk',
  '9999',
]

function __uniq_Filter (__array_1, __array_2) {
  const one_not_in_two = __array_1.filter(function (obj) {
    return __array_2.indexOf(obj) == -1
  })
  const two_not_in_one = __array_2.filter(function (obj) {
    return __array_1.indexOf(obj) == -1
  })
  return one_not_in_two.concat(two_not_in_one)
}

let uniq_filter = __uniq_Filter(ids_exist, ids_new)

console.log('uniq_filter', uniq_filter) // => [ 'abcd', 'efjk', '9999' ]

我同意@luis-sieira 的解決方案

我為初學者創建了一些自我解釋功能,以便逐步輕松理解:

function difference(oneArr, twoArr){
  var newArr = [];
  newArr = oneArr.filter((item)=>{
      return !twoArr.includes(item)
  });
  console.log(newArr)
    let arr = twoArr.filter((item)=>{
        return !oneArr.includes(item)
     });
    newArr =  newArr.concat(arr);
  console.log(newArr)
}
difference([1, 2, 3, 5], [1, 2, 3, 4, 5])
    function arrayDiff(a, b) {
      return a.concat(b).filter(val => !(b.includes(val)));
      //(or) return a.concat(b).filter(val => !(a.includes(val) && b.includes(val)));
    }

回應想從另一個數組中減去一個數組的人......

如果不超過 1000 個元素,試試這個......

設置一個新變量來復制 Array01 並將其命名為 Array03。

現在,使用冒泡排序算法比較 Array01 和 Array02 的元素,只要找到匹配項,就對 Array03 執行以下操作...

 if (Array01[x]==Array02[y]) {Array03.splice(x,1);}

注意:我們正在修改 Array03 而不是 Array01 以免搞砸冒泡排序的嵌套循環!

最后,通過簡單的賦值將Array03的內容復制到Array01,大功告成。

這是另一個可以返回差異的解決方案,就像 git diff :(它是用打字稿編寫的,如果您沒有使用打字稿版本,只需刪除類型)

/**
 * util function to calculate the difference between two arrays (pay attention to 'from' and 'to'),
 * it would return the mutations from 'from' to 'to' 
 * @param { T[] } from
 * @param { T[] } to
 * @returns { { [x in string]: boolean } } it would return the stringified version of array element, true means added,
 * false means removed
 */
export function arrDiff<T>(from: T[], to: T[]): { [x in string]: boolean } {

  var diff: { [x in string]: boolean } = {};
  var newItems: T[] = []
  diff = from.reduce((a, e) => ({ ...a, [JSON.stringify(e)]: true }), {})

  for (var i = 0; i < to.length; i++) {
    if (diff[JSON.stringify(to[i])]) {
      delete diff[JSON.stringify(to[i])]
    } else {
      newItems.push(to[i])
    }
  }

  return {
    ...Object.keys(diff).reduce((a, e) => ({ ...a, [e]: false }), {}),
    ...newItems.reduce((a, e) => ({ ...a, [JSON.stringify(e)]: true }), {})
  }
}

下面是一個使用示例:

arrDiff(['a', 'b', 'c'], ['a', 'd', 'c', 'f']) //{"b": false, "d": true, "f": true}

塞繆爾:“對於我的代碼,我也需要刪除重復項,但我想這並不總是首選。我想主要的缺點是它可能會比較許多已經被拒絕的選項。”

當比較兩個列表、數組等,並且元素小於 1000 時,3GL 世界的行業標准是使用冒泡排序,避免重復。

代碼看起來像這樣......(未經測試但它應該可以工作)

var Array01=new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P');
var Array02=new Array('X','B','F','W','Z','X','J','P','P','O','E','N','Q');
var Array03=Array01;

for(x=1; x<Array02.length; x++) {
 for(y=0; y<Array01.length-1; y++) {
  if (Array01[y]==Array02[x]) {Array03.splice(y,1);}}}

Array01=Array03;

要測試輸出...

for(y=0; y<Array01.length; y++) {document.write(Array01[y])}

如果你想找到兩個對象數組之間差異,你可以這樣做:

 let arrObj = [{id: 1},{id: 2},{id: 3}] let arrObj2 = [{id: 1},{id: 3}] let result = arrObj.filter(x => arrObj2.every(x2 => x2.id !== x.id)) console.log(result)

const a1 = ['a', 'b', 'c', 'd'];
const a2 = ['a', 'b'];

const diffArr = a1.filter(o => !a2.includes(o));

console.log(diffArr);

輸出:

[ 'a', 'b' ]

我在這里閱讀的答案存在很多問題,使它們在實際編程應用程序中的價值有限。

首先,您需要有一種方法來控制數組中的兩個項目“相等”意味着什么。 如果您試圖確定是否根據 ID 或類似的東西更新對象數組,則 === 比較不會削減它,坦率地說,這可能是您想要的最有可能的場景之一一個差異函數。 它還將您限制為可以與 === 運算符進行比較的數組,即字符串、整數等,這對於成年人來說幾乎是不可接受的。

其次,diff 操作有三種狀態結果:

  1. 位於第一個數組中但不在第二個數組中的元素
  2. 兩個數組共有的元素
  3. 位於第二個數組中但不在第一個數組中的元素

我認為這意味着您需要不少於 2 個循環,但是如果有人知道將其減少到一個的方法,我會對骯臟的技巧持開放態度。

這是我拼湊起來的東西,我想強調的是,我絕對不在乎它在舊版本的 Microshaft 瀏覽器中不起作用。 如果您在 IE 等劣質編碼環境中工作,則由您來修改它以在您遇到的令人不滿意的限制內工作。

Array.defaultValueComparison = function(a, b) {
    return (a === b);
};

Array.prototype.diff = function(arr, fnCompare) {

    // validate params

    if (!(arr instanceof Array))
        arr = [arr];

    fnCompare = fnCompare || Array.defaultValueComparison;

    var original = this, exists, storage, 
        result = { common: [], removed: [], inserted: [] };

    original.forEach(function(existingItem) {

        // Finds common elements and elements that 
        // do not exist in the original array

        exists = arr.some(function(newItem) {
            return fnCompare(existingItem, newItem);
        });

        storage = (exists) ? result.common : result.removed;
        storage.push(existingItem);

    });

    arr.forEach(function(newItem) {

        exists = original.some(function(existingItem) {
            return fnCompare(existingItem, newItem);
        });

        if (!exists)
            result.inserted.push(newItem);

    });

    return result;

};

這個問題很老,但仍然是javascript 數組減法的熱門話題,所以我想添加我正在使用的解決方案。 這適用於以下情況:

var a1 = [1,2,2,3]
var a2 = [1,2]
//result = [2,3]

以下方法將產生所需的結果:

function arrayDifference(minuend, subtrahend) {
  for (var i = 0; i < minuend.length; i++) {
    var j = subtrahend.indexOf(minuend[i])
    if (j != -1) {
      minuend.splice(i, 1);
      subtrahend.splice(j, 1);
    }
  }
  return minuend;
}

應該注意的是,該函數不包括被減數中不存在的減數值:

var a1 = [1,2,3]
var a2 = [2,3,4]
//result = [1]

只是修剪字符串以確保......空格不會影響差異

function arr_diff(a1, a2) {
    var a=[], diff=[];
    for(var i=0;i<a1.length;i++)
        a[a1[i]]=true;
    for(var i=0;i<a2.length;i++)
        if(a[a2[i].trim()]) delete a[a2[i].trim()];
    else a[a2[i].trim()]=true;
    for(var k in a)
        diff.push(k);
    return diff;
}

我已經嘗試了以上所有這些,但是當您需要匹配而不接受重復項時,沒有一個有效。

例如:

var a1 = [1, 2, 1, 4], a2 = [1, 2, 4];

將返回一個空的 diff 數組,因為2將在第二個數組中找到一次,即使我們需要它匹配兩次。

所以我設法解決了一些問題:

Array.prototype.diff = function(a) {
    return this.filter(function(item) {
        match = a.indexOf(item);
        if (match)
            a.splice(match, 1);
        return match < 0;
    });
};

這是我用來獲取 2 個數組之間差異的函數 - 它適用於數值、字符串、混合 num/字符串數組。 不是數組/多維數組中的對象字面量

function diff(arr1, arr2) {

    var x, 
        t;

    function uniq(a, b) {
        t = b;

        if( (b === 0 && x[b+1]!==a) || 
           (t > 0 && a !== x[b+1] && a !== x[b-1]) ) {
            return  a;
        }
    }


    x = arr1.concat(arr2).sort();

    return x.filter(uniq);
}

var a1 = ['a', 'b', 'e', 'c'],
    a2 = ['b', 'a', 'c', 'f' ];

diff(a1, a2);

如果你的數組包含對象,如果你想比較一個屬性會變得有點困難。

幸運的是lodash使用_contains_.pluck使這變得非常容易:

var list1 = [{id: 1},{id: 2}];
var list1 = [{id: 1},{id: 2}, {id: 3}];

//es6
var results = list2.filter(item => {
  return !_.contains(_.pluck(list1, 'id'), item.id);
});

//es5
var results = list2.filter(function(item){
  return !_.contains(_.pluck(list1, 'id'), item.id);
});

//results contains [{id: 3}]

這是我使用的:

var newArr = a1.filter(function(elem) {
            return a2.indexOf(elem) === -1;
        }).concat( a2.filter(function(elem) {
            return a1.indexOf(elem) === -1;
        }));
console.log(newArr);

或者這個

var newArr = a1.concat(a2);
        function check(item) {
            if (a1.indexOf(item) === -1 || a2.indexOf(item) === -1) {
                return item;
            }
        }
        return newArr.filter(check);
var arrayDifference = function(arr1, arr2){
  if(arr1 && arr1.length){
    if(arr2 && arr2.length > 0){
      for (var i=0, itemIndex; i<arr2.length; i++){
        itemIndex = arr1.indexOf(arr2[i]);
        if(itemIndex !== -1){
          arr1.splice(itemIndex, 1);
        }
      }
    }
    return arr1;
  }
  return [];
};

arrayDifference([1,2,3,4,5], [1,5,6]);

艱難的方式(如果你想做一些比 .indexOf 更奇特的事情)

var difference = function (source, target) {
    return source.reduce(function (diff, current) { 
        if (target.indexOf(current) === -1) { 
            diff.push(current); 
        }

        return diff; 
    }, []);
}

簡單的方法

var difference = function (source, target) {
    return source.filter(function (current) {
        return target.indexOf(current) === -1;
    });
}

數據:

var new_storage = JSON.parse('[{"id_order":"0003"},{"id_order":"0004"},{"id_order":"0006"}]');

var old_storage = JSON.parse('[{"id_order":"0001"},{"id_order":"0002"},{"id_order":"0003"},{"id_order":"0004"},{"id_order":"0005"}]');

使用過濾器:

var diff = new_storage
.filter(x => {if(!(old_storage.filter(y => y.id_order==x.id_order)).length){return x}})
    .concat(old_storage
    .filter(x => {if(!(new_storage.filter(y => y.id_order==x.id_order)).length){return x}})
                       ) 

console.log(JSON.stringify(diff))

兩個數組的結果差異

[{"id_order":"0006"},{"id_order":"0001"},{"id_order":"0002"},{"id_order":"0005"}]
const difference = function (baseArray, arrayToCampare, callback = (a, b) => a!== b) {
  if (!(arrayToCampare instanceof Array)) {
    return baseArray;
  }
  return baseArray.filter(baseEl =>
    arrayToCampare.every(compareEl => callback(baseEl, compareEl)));
}
function array_diff(a, b) {

    let array = [];
    for(let i = 0; i <a.length; i++) {
        let k = 0;
        for( let j = 0; j < b.length; j++) {
            if(a[i]!==b[j]) {
                k++;
            }
            if(k===b.length) {
                array = array.concat(a[i]);
            }
        }

        if(b.length ===0) {
            array = array.concat(a[i]);
        }
    }
    return array;
}

這是我如何獲得兩個數組差異。 純凈而干凈。

它將返回一個包含 [add list] 和 [remove list] 的對象。

  function getDiff(past, now) {
        let ret = { add: [], remove: [] };
        for (var i = 0; i < now.length; i++) {
          if (past.indexOf(now[i]) < 0)
            ret['add'].push(now[i]);
        }
        for (var i = 0; i < past.length; i++) {
          if (now.indexOf(past[i]) < 0)
            ret['remove'].push(past[i]);
        }
        return ret;
      }

您可以使用一個公共對象並計算第一個數組中每個值的頻率。 對於第二個數組,遞減公共對象中的值。 然后遍歷所有鍵並添加所有值大於 1 的鍵。

 const difference = (a1, a2) => { var obj = {}; a1.forEach(v => obj[v] = (obj[v] || 0) + 1); a2.forEach(v => obj[v] = (obj[v] || 0) - 1); return Object .keys(obj) .reduce((r,k) => { if(obj[k] > 0) r = r.concat(Array.from({length: obj[k]}).fill(k)); return r; },[]); }; const result = difference(['a', 'a', 'b', 'c', 'd'], ['a', 'b']); console.log(result);

**這將根據“類型”參數為任何 2 個數組返回唯一值數組、重復數組或非重復數組(差異)。 **

let json1 = ['one', 'two']
let json2 = ['one', 'two', 'three', 'four']

function uniq_n_shit (arr1, arr2, type) {

  let concat = arr1.concat(arr2)
  let set = [...new Set(concat)]

  if (!type || type === 'uniq' || type === 'unique') {

    return set

  } else if (type === 'duplicate') {

    concat = arr1.concat(arr2)
    return concat.filter(function (obj, index, self) {
      return index !== self.indexOf(obj)
    })

  } else if (type === 'not_duplicate') {

    let duplicates = concat.filter(function (obj, index, self) {
      return index !== self.indexOf(obj)
    })

    for (let r = 0; r < duplicates.length; r++) {
      let i = set.indexOf(duplicates[r]);
      if(i !== -1) {
        set.splice(i, 1);
      }
    }

    return set

  }
}

console.log(uniq_n_shit(json1, json2, null)) // => [ 'one', 'two', 'three', 'four' ]
console.log(uniq_n_shit(json1, json2, 'uniq')) // => [ 'one', 'two', 'three', 'four' ]
console.log(uniq_n_shit(json1, json2, 'duplicate')) // => [ 'one', 'two' ]
console.log(uniq_n_shit(json1, json2, 'not_duplicate')) // => [ 'three', 'four' ]

對我來說,將其作為部分功能來處理感覺更容易。 很驚訝沒有看到函數式編程解決方案,這是我在 ES6 中的:

const arrayDiff = (a, b) => {
  return diff(b)(a);
}

const contains = (needle) => (array) => {
  for (let i=0; i < array.length; i++) {
    if (array[i] == needle) return true;
  }

  return false;
}

const diff = (compare) => {
    return (array) => array.filter((elem) => !contains(elem)(compare))
}

如果您不關心原始數組並且編輯它們沒有問題,那么這是更快的算法:

let iterator = arrayA.values()
let result = []
for (entryA of iterator) {
    if (!arrayB.includes(entryA)) {
        result.push(entryA)
    } else {
        arrayB.splice(arrayB.indexOf(entryA), 1) 
    }
}

result.push(...arrayB)
return result

基於思想者的回答,但允許重復。

地圖在地圖值出現時遞增,如果它們在另一個數組中,則遞減它們。

任何剩余部分都將包含在差價中。

 function diff(curr, prev) { let a = curr.split('').sort(), b = prev.split('').sort(), c = arrDiff(a, b); console.log(JSON.stringify(a), '-', JSON.stringify(b), '=', JSON.stringify(c)); return c; } function arrDiff(larger, smaller) { var entries = {}; for (var i = 0; i < larger.length; i++) { entries[larger[i]] = (entries[larger[i]] || 0) + 1; } for (var i = 0; i < smaller.length; i++) { if (entries[smaller[i]]) { entries[smaller[i]] -= 1; } else { entries[smaller[i]] = (entries[smaller[i]] || 0) + 1; } } return Object.keys(entries).sort().reduce((diff, key) => { if (entries[key] > 0) { for (var i = 0; i < entries[key]; i++) { diff.push(key); } } return diff; }, []); } // Smaller is a subset of Larger console.log('Result:', JSON.stringify(diff('ENLIGHTEN', 'LENGTHEN'))); // [ I ] console.log('Result:', JSON.stringify(diff('STRENGTH', 'TENTHS'))); // [ G, R ] // Both have a unique value console.log('Result:', JSON.stringify(diff('BUBBLE', 'RUBBLE'))); // [ B, R ]
 .as-console-wrapper { top: 0; max-height: 100% !important; }

基於以前的答案......取決於您是否想要一個有效的或“不錯的oneliner”解決方案。

一般有3種方法...

  • “手動迭代”(使用 indexOf) - O(n2) 復雜度的幼稚(慢)

     var array_diff_naive = function(a,b){ var i, la = a.length, lb = b.length, res = []; if (!la) return b; else if (!lb) return a; for (i = 0; i < la; i++) { if (b.indexOf(a[i]) === -1) res.push(a[i]); } for (i = 0; i < lb; i++) { if (a.indexOf(b[i]) === -1) res.push(b[i]); } return res; }
  • “抽象迭代”(使用過濾器和 concat 庫方法)——手動迭代的語法糖(看起來更好,但仍然很糟糕)

     var array_diff_modern = function(a1,a2){ return a1.filter(function(v) { return !a2.includes(v); } ) .concat(a2.filter(function(v) { return !a1.includes(v);})); }
  • “使用哈希表”(使用對象鍵) - 效率更高 - 只有 O(n),但輸入數組值的范圍略有限制

     var array_diff_hash = function(a1,a2){ var a = [], diff = []; for (var i = 0; i < a1.length; i++) { a[a1[i]] = true; } for (var i = 0; i < a2.length; i++) { if (a[a2[i]]) { delete a[a2[i]]; } else { a[a2[i]] = true; } } for (var k in a) { diff.push(k); } return diff; }

在 jsperf 上看到這個
https://jsperf.com/array-diff-algo

這是一個稍微修改過的版本,它使用一個對象來存儲散列,可以處理數組中的數字和字符串。

function arrDiff(a, b) {
  const hash = {};
  a.forEach(n => { hash[n] = n; });
  b.forEach(n => {
    if (hash[n]) {
      delete hash[n];
    } else {
      hash[n] = n;
    }
  });
  return Object.values(hash);
}
var compare = array1.length > array2.length ? array1 : array2;
var compareWith = array1.length > array2.length ? array2 : array1;
var uniqueValues = compareWith.filter(function(value){
                    if(compare.indexOf(vakye) == -1)
                       return true;
                   });

這將檢查數組中哪一個較大,然后進行比較。

function diffArray(newArr, oldArr) {
    var newSet = new Set(newArr)
    var diff = []
    oldArr.forEach((a) => {
        if(!newSet.delete(a))diff.push(a)
    })
    return diff.concat(Array.from(newSet)) 
}

嘗試一下。

var first = [ 1, 2, 3, 4, 5 ];
    var second = [ 4, 5, 6 ];
     
    var difference = first.filter(x => second.indexOf(x) === -1);
    console.log(difference);


Output: [ 1, 2, 3]

響應adaen已關閉的帖子( 比較包含整數 JavaScript 的兩個數組):

幾個選項:

  1. 簡單 -> 您可以將第二個數組的所有條目添加到哈希映射中。 然后迭代第一個數組中的條目並記錄哈希圖中不存在的條目。
const arrOne = [2,3,10,7,9,15,7,15,21,1];
const arrTwo = [3,15,1,2,21];

const hash = {};

arrTwo.forEach(a => hash[a]++);
arrOne.filter(a => typeof hash[a] === 'undefined').forEach(a => console.log(a));
  1. 您的另一個選擇是對兩個數組進行排序。 然后迭代第二個數組。 在其中,迭代第一個數組。 當您遇到第一個數組中的條目小於第二個數組中的下一個條目但不等於它時,您將它們注銷。
const arrOne = [2,3,10,7,9,15,7,15,21,1].sort((a,b)=>a-b);
const arrTwo = [3,15,1,2,21].sort((a,b)=>a-b);

var i1 = 0;
for(var i2 = 0; i2 < arrTwo.length; i2++) {
  while(arrOne[i1] < arrTwo[i2+1]) {
    if(arrOne[i1] != arrTwo[i2]) {
      console.log(arrOne[i1]);
    }
    i1++;
  }
}

如果您有兩個對象列表

const people = [{name: 'cesar', age: 23}]
const morePeople = [{name: 'cesar', age: 23}, {name: 'kevin', age: 26}, {name: 'pedro', age: 25}]

let result2 = morePeople.filter(person => people.every(person2 => !person2.name.includes(person.name)))
function array_diff(array1, array2) {
   let returnArray = [];
   $.each(array1, function(index, value) {
     let findStatus = false;
     if (Array.isArray(array2)) {
       $.each(array2, function(index2, value2) {
         if (value == value2) findStatus = true;
       });
     } else {
       if (value == array2) {
         findStatus = true;
       }
     }

     if (findStatus == false) {
       returnArray.push(value);
     }
   });
   return returnArray;
}
function diffArray(arr1, arr2) {
  const newArr = [];

// arr1 match to arr2
arr1.map((item)=>{
if(arr2.indexOf(item)<0){
  console.log(item)
  newArr.push(item)
}  
})

// arr2 match to arr1
arr2.map((item)=>{
if(arr1.indexOf(item)<0){
  newArr.push(item)
}
})

  return newArr; 
}

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5])

輸出 :: [ 4 ]

const dbData = [{name:'ally'}, 
{name:'James'}]
const localData = [{name:'James'}] 

const diff = dbData.filter(a =>!localData.some(b => { return a.name === b.name}))

這是使用 map 的更快方法,它提供 o(n) 復雜度

const arr1 = ['a','b','c','d'];
const arr2 = ['a','b','c']
let table = {}
arr1.forEach(v=>{table[v]=false})
arr2.forEach(v=>{
    if(table[v]===false) table[v] = true
    else table[v] = false
})
const diff = Object.keys(table).filter(v=>table[v]==false)

我陷入了這個問題,這是為了得到兩個簡單數組的差異

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

// need ["c", "d"]

我不明白為什么不使用基本的 for 循環:

for(var i=0; i < a1.length; i++) {
  for(var j=0; j < a2.length; j++) {
    if(a1[i] == a2[j]) {
      a2.splice(j, 1);
    }
  }
}

這將返回所需的["c", "d"]

[編輯] 建議在上面,看到晚了。

無論如何,有什么好的理由避免這個簡單的解決方案?

轉換為字符串對象類型:

[1, 1].toString() === [1, 1].toString(); // true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM