简体   繁体   English

如何在 Typescript/Javascript 中获取两个对象数组之间的差异

[英]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 比较并由它的标识符标识(在您的情况下checkedid ),您可以使用这样的方法。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM