2017-05-26 68 views
1

我對對象的陣列,其看起來如下:的Javascript /下劃線/ lodash:在對象數組比較對象並取出匹配的對象

var arrayOfObjects = [ 
    { 
    key_a : "value1", 
    key_b : "value2" 
    }, 
    { 
    key_c : "value12", 
    key_d : "value23" 
    } 
]; 

現在,我有另一個目的:

var objToCompare = { 
    key_a : "value1", 
    key_b : "value2" 
}; 

比較'objToCompare'與'arrayOfObjects'並從'arrayOfObjects'中刪除匹配對象的可能方法是什麼? - 使用javascript還是下劃線js或lodash?

所以,物體的合成陣列看起來像:

var arrayOfObjects = [ 
    { 
    key_c : "value12", 
    key_d : "value23" 
    } 
]; 

*目的只應該從物體的陣列中,當所有的屬性匹配移除。

回答

0

應儘可能簡單:

arrayOfObjects.filter((item) => !(item.key_a === objToCompare.key_a && item.key_b === objToCompare.key_b)) 

編輯:FWIW:這是一個純JavaScript的解決方案,只是做的事情需要並沒有有效地重建lodash /下劃線isEqual

+0

如果將來會出現新的'key_z'會怎麼樣?這不是好的解決方案 –

+0

@MedetTleukabiluly我不明白你的觀點。 – Jack

+0

使用硬編碼值 –

1

您可以使用_.reject和_.isEqual方法。這幾乎與Underscore/Lodash中的_.where方法完全相反。

let result = _.reject(arrayOfObjects, (obj) => _.isEqual(obj, objToCompare)) 
+0

我想你不應該在這裏混合es6 –

1

純JavaScript版本

var arrayOfObjects = [{ 
 
    key_a: "value1", 
 
    key_b: "value2" 
 
    }, 
 
    { 
 
    key_c: "value12", 
 
    key_d: "value23" 
 
    } 
 
]; 
 

 
var objToCompare = { 
 
    key_a: "value1", 
 
    key_b: "value2" 
 
}; 
 

 
// credits https://stackoverflow.com/a/6713782/2308005 
 
function objectEquals(x, y) { 
 
    if (x === y) return true; 
 
    if (!(x instanceof Object) || !(y instanceof Object)) return false; 
 
    if (x.constructor !== y.constructor) return false; 
 
    for (var p in x) { 
 
    if (!x.hasOwnProperty(p)) continue; 
 
    if (!y.hasOwnProperty(p)) return false; 
 
    if (x[p] === y[p]) continue; 
 
    if (typeof(x[p]) !== "object") return false; 
 
    if (!Object.equals(x[p], y[p])) return false; 
 
    } 
 
    for (p in y) { 
 
    if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) return false; 
 
    } 
 
    return true; 
 
} 
 

 

 
var result = arrayOfObjects.filter(function(item) { 
 
    return !objectEquals(item, objToCompare); 
 
}); 
 

 
console.log(result);

2

我已經找到了一種簡單的方法來解決你的問題。將objectToCompare轉換爲數組並使用_.differenceWith()進行比較。

請查看下面的代碼。

var _ = require('lodash') 

    var arrayOfObjects = [ 
     { 
     key_a : "value1", 
     key_b : "value2" 
     }, 
     { 
     key_c : "value12", 
     key_d : "value23" 
     } 
    ] 


    var objToCompare = { 
     key_a : "value1", 
     key_b : "value2" 
    } 

    var arrayToCompare = [] 
    arrayToCompare.push(objToCompare) 

    var result = _.differenceWith(arrayOfObjects, arrayToCompare, _.isEqual) 

    console.log(result) 
+0

@Medet Tleukabiluly我的解決方案如何。 –

+0

非常感謝!這很容易和真棒:) :) – Curious86

+0

@ Curious86如果你發現有用。你能不能請它好嗎? –