[英]How to get the difference between two arrays of objects in Typescript/Javascript
I have two arrays of objects like:我有两个对象数组,例如:
[{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: true}]
and和
[{id: "1", name: "item1", checked: true}, {id: "2", name: "item2", checked: true}, {id: "3", name: "item3", checked: false}]
The first array holds the default states, the second one hold the current states.第一个数组保存默认状态,第二个保存当前状态。 I'd like to filter out the objects that "checked" is changed.
我想过滤掉“检查”更改的对象。 The expected result would be
预期的结果是
[{id: "3", name: "item3", checked: false}]
I tried with loadash differentBy, but it returns empty array:我尝试使用 loadash differentBy,但它返回空数组:
const diff=_.differenceBy(array1, array2, "checked")
Can anyone help out?任何人都可以帮忙吗? Thanks.
谢谢。
You could use a method like this, if an item in the array compared by keyToCompare and identified by it's identifier (In your situation checked
and id
).如果数组中的项目由 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
}
Example:例子:
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'))
A very compact solution -but O(n^2)- with _.differenceWith :一个非常紧凑的解决方案-但是 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 }]
A bit more verbose, but this one is O(n):有点冗长,但这个是 O(n):
const xsById = _.keyBy(xs, x => x.id)
const zs = ys.filter(y => xsById[y.id]?.checked !== y.checked)
I guess you could use something like that我想你可以使用类似的东西
function compareArrays(arr1, arr2, keyCompared) {
let d = []
arr1.forEach((e,i)=>{
if(e[keyCompared] !== arr2[i][keyCompared])
d.push(e)
})
return d
}
Example:例子:
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.