2016-07-16 35 views
0

enter image description here的第一陣列我在javascript得到從陣列元件,其不處於物體

var arr1 = [{'a':'1'},{'b':'2'},{'c':'3'}]; 
var arr2 = [{'a':'1'},{'b':'2'},{'d':'4'}]; 

我想從ARR2這不是在ARR1的元件對象的兩個數組。 我的輸出將是[{'d':'4'}]

+1

的可能的複製[JavaScript數組差(http://stackoverflow.com/questions/1187518/javascript-array-difference) –

+0

是這項工作對象數組? – Kallis

+1

'arr2'中的元素都不在'arr1'中,它們都不一樣? – adeneo

回答

1

是來到我的腦海裏,最簡單的方法是透過JSON.stringify:

var arr1 = [{'a':'1'},{'b':'2'},{'c':'3'}]; 
 
var arr2 = [{'a':'1'},{'b':'2'},{'d':'4'}]; 
 

 
stringArr1 = JSON.stringify(arr1); 
 
var result = arr2.filter(
 
    obj => !~stringArr1.indexOf(JSON.stringify(obj)) 
 
); 
 

 
console.log(result);

但應該有更好的方式。


的等效:

var result = arr2.filter(
    obj => !~stringArr1.indexOf(JSON.stringify(obj)) 
); 

是常見的:

var result = arr2.filter(function (obj) { 
    var stringObj = JSON.stringify(obj); 
    if (stringArr1.indexOf(stringObj) != -1) 
    return true; 
    else 
    return false; 
}); 

的招數很簡單,基本上你需要知道的三兩件事:

  1. 所有非 - 零數字是真實的。 SO link.
  2. 按位不(~)變爲-1到0 MDN link.
  3. 內嵌箭頭函數(=>)不需要return關鍵字。 MDN link.

希望它能幫助:)

+0

如果你不介意可以解釋'obj =>!〜stringArr1.indexOf(JSON.stringify(obj))'這一行並告訴我使用「〜」。 – Kallis

0

您可以使用$.grep().every()Object.keys()

var arr1 = [{'a':'1'},{'b':'2'},{'c':'3'}]; 
 
var arr2 = [{'a':'1'},{'b':'2'},{'d':'4'}]; 
 
var res = $.grep(arr2, function(v) { 
 
      return arr1.every(function(_v) { 
 
       var keys = [Object.keys(v)[0], Object.keys(_v)[0]]; 
 
       return keys[0] !== keys[1] && v[keys[0]] !== _v[keys[1]] 
 
      }) 
 
      }); 
 
console.log(res)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

+0

如果我使用其他對象,未捕獲TypeError:arr1.every是不是函數 – Kallis

+0

_「如果我使用其他對象」_你是什麼意思的「其他對象」?你可以創建一個jsfiddle http://jsfiddle.net來演示嗎? – guest271314

+0

我使用其他數據而不是「arr1」和「arr2」數據 – Kallis

0

您可以使用JSON.stringify的陣列中的每個元素,並使用哈希表檢查

var arr1 = [{ 'a': '1' }, { 'b': '2' }, { 'c': '3' }], 
 
    arr2 = [{ 'a': '1' }, { 'b': '2' }, { 'd': '4' }], 
 
    arr3, 
 
    hash = Object.create(null); 
 

 
arr1.forEach(function (o) { 
 
    hash[JSON.stringify(o)] = true; 
 
}); 
 

 
arr3 = arr2.filter(function (o) { 
 
    return !hash[JSON.stringify(o)]; 
 
}); 
 

 
console.log(arr3);