【问题标题】:How to filter object and updated what is filtered? JavaScript如何过滤对象并更新过滤的内容? JavaScript
【发布时间】:2020-07-30 21:10:27
【问题描述】:

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

例如:

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

我有上面的全局父对象,就是接受数据并保存的任务。 (和 Redux 中的 store 一样)

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",
    }]
}

我该怎么做?

谢谢!

【问题讨论】:

    标签: javascript object filter filtering updates


    【解决方案1】:

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

    您可以使用deepmergelodash merge

    如果您确切知道要更新哪些键,您可以简单地为每个单独的级别和键使用Object.assign。 Object.assign 进行浅拷贝/合并。

    对于第一级,可以使用 Object.assign

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

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

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

    只有在数组大小相同时才有效。这非常重要。

    合并 2 个数组的含义并不简单。有很多问题让数组合并变得不简单:

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

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

    【讨论】:

    • 谢谢。但我想了解如何在没有库的情况下手动执行此操作 :) 随时在此处发布完整代码 :)
    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2020-10-21
    • 2020-05-29
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多