首页 > 解决方案 > 用地图替换嵌套对象

问题描述

我正在尝试用带有地图的更新对象替换嵌套对象。但是,它只有在我替换每个属性时才有效,但我不能用更新的对象替换整个对象。以下是我的结构:

[
    {
        name: 'Parent 1',
        data: [
            {
                id: 1,
                name: 'Child 1', 
                // more properties ...,
            },
            {
                id: 2,
                name: 'Child 2', 
                // more properties ...
            }
        ]
    }
]

现在我想用更新的孩子替换其父母中的孩子。这就是我现在拥有的,它可以工作,但是手动映射每个属性是不可维护的:

    parents.map(parent =>
        parent.data.map(child => {
            if (child.id === newChild.id) {
                child.name = newChild.name;
                // more mappings ...
            }
        })
    );

这是行不通的,但我更喜欢的解决方案:

    parents.map(parent =>
        parent.data.map(child => {
            if (child.id === newChild.id) {
                child= newChild;
            }
        })
    );

我也对其他解决方案持开放态度,而不是使用地图。我不确定这是否是正确的做法。

标签: javascript

解决方案


我不知道这newChild是从哪里来的,但是...

如果你想替换整个孩子,你必须使用它的索引。像这样,

parents.forEach(parent => parent.data.forEach((child, index) => {
    if (child.id == newChild.id) child.data[index] = newChild;
}));

如果不是,您只是child在该循环中更改变量的值。

因为我假设您要编辑原始数组,所以我将其更改map为。forEach用这个

parents = parents.map(parent => parent.data.map((child, index) => (child.id == newChild.id) ? newChild : child));

这样,如果ids匹配,新孩子将在地图中占据旧孩子的这个空间,否则仍将返回旧孩子


推荐阅读