如何过滤对象并更新过滤的内容? JavaScript

How to filter object and updated what is filtered? JavaScript

我想过滤对象并更新过滤后的结果。

例如:

// global object (parent)
let globalObj = {
    id: 123,
    name: "No Name",
    attributes: [{
        keyA: "Key",
        keyB: "Keys 2",
    }]
}

我有上面的全局父对象,就是接受数据并保存的任务。 (就像 Redux 中的商店)

let updatedObj = {
    id: 123,
    name: "New Name",
    attributes: [{
        keyA: "New Key",
    }]
}

好吧,现在我想用新的copare过滤全局对象,过滤它并只更新更改的内容,其他的必须取消..
结果我想得到这样的东西:

// global object (parent after update)
let globalObj = {
    id: 123,
    name: "New Name",
    attributes: [{
        keyA: "New Key",
        keyB: "Keys 2",
    }]
}

我该怎么做?

谢谢!

最简单的方法是为此使用 deep merge 包。

您可以使用deepmerge or lodash merge

如果您确切知道要更新哪些密钥,您可以简单地使用 Object.assign 用于 每个单独的级别和密钥 。 Object.assign 做了浅层 copy/merge.

第一级可以用Object.assign

let mergedObject = Object.assign({}, globalObj, updatedObj) 

这将正确合并顶级键,但属性会出错。因此,您需要为此降低一级。

merged.attributes = globalObj.attributes.map( (item, index) => 
  Object.assign({}, item, updatedObj.attributes[i])
)

只有在数组大小相同的情况下才有效 。这非常重要。

合并 2 个数组的含义并不明确。有很多问题使数组合并变得非常重要:

  • 如何添加新项目
  • 如何识别匹配的元素,以便知道要更新的元素
  • 你是根据指数做出这个决定(像我一样),还是使用其他策略

这在很大程度上取决于您如何唯一标识数组元素,而这本身就很重要。