![](/img/trans.png)
[英]How to get the difference between two arrays of objects in JavaScript
[英]How to get the difference between two arrays of objects in Typescript/Javascript
我有兩個對象數組,例如:
[{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}]
和
[{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}]
第一個數組保存默認狀態,第二個保存當前狀態。 我想過濾掉“檢查”更改的對象。 預期的結果是
[{id: "3", name: "item3", checked: false}]
我嘗試使用 loadash differentBy,但它返回空數組:
const diff=_.differenceBy(array1, array2, "checked")
任何人都可以幫忙嗎? 謝謝。
如果數組中的項目由 keyToCompare 比較並由它的標識符標識(在您的情況下checked
和id
),您可以使用這樣的方法。
const differenceBy = (arr1, arr2, keyToCompare, identifier) => {
const diff = []
arr1.forEach(arr => {
const arr2Item = arr2.find(i => i[identifier] === arr[identifier])
if(arr[keyToCompare] !== arr2Item[keyToCompare]) {
diff.push(arr2Item)
}
})
return diff
}
例子:
const arr1 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}] const arr2 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}] const differenceBy = (arr1, arr2, keyToCompare, identifier) => { const diff = [] arr1.forEach(arr => { const arr2Item = arr2.find(i => i[identifier] === arr[identifier]) if(arr[keyToCompare] !== arr2Item[keyToCompare]) { diff.push(arr2Item) } }) return diff } console.log(differenceBy(arr1, arr2, 'checked', 'id'))
一個非常緊湊的解決方案-但是 O(n^2)- 帶有_.differenceWith :
const xs = [
{id: "1", name: "item1", checked: true},
{id: "2", name: "item2", checked: true},
{id: "3", name: "item3", checked: true}
]
const ys = [
{id: "1", name: "item1", checked: true},
{id: "2", name: "item2", checked: true},
{id: "3", name: "item3", checked: false}
]
const zs = _.differenceWith(xs, ys, _.isEqual)
// [{ id: "3", name: "item3", checked: true }]
有點冗長,但這個是 O(n):
const xsById = _.keyBy(xs, x => x.id)
const zs = ys.filter(y => xsById[y.id]?.checked !== y.checked)
我想你可以使用類似的東西
function compareArrays(arr1, arr2, keyCompared) {
let d = []
arr1.forEach((e,i)=>{
if(e[keyCompared] !== arr2[i][keyCompared])
d.push(e)
})
return d
}
例子:
let array1 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}] let array2 = [{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}] function compareArrays(arr1, arr2, keyCompared) { let d = [] arr1.forEach((e,i)=>{ if(e[keyCompared] !== arr2[i][keyCompared]) d.push(e) }) return d } console.log(compareArrays(array1,array2,'checked'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.