使用 immutability-helper 来 $merge 一个数组

fre*_*les 3 arrays merge immutability reactjs

我从下面的代码中收到以下错误:
Error: update(): $merge Expects a target of type 'object'; 未定义

我正在尝试合并 2 个数组,同时仅更新原始数组中项目中的某些值。例如,我想更新状态更新的属性,但不想更新成员数组属性。

我认为问题可能在于更新方法中使用索引,但这只是一个猜测。有任何想法吗?如果有更好的方法,我很想知道。

const oldProjects = [
    {id: 1, members:[{name: 'Al'},{name: 'Joe'}], status: 'new', updated: '2017-05-19 12:00:00'},
];

const newProjects = [
    {id: 1, members:[], status: 'in-progress', updated: '2017-05-19 14:05:00'},
    {id: 2, members:[], status: 'new', updated: '2017-05-19 14:10:00'},
    {id: 3, members:[], status: 'completed', updated: '2017-05-19 14:15:00'},
];

let newState = oldProjects;

newProjects.forEach(np => {
    const index = oldProjects.findIndex(op => op.id === np.id);
    if (index === -1) {
        newState = update(newState, {$push: np});
    } else {
        newState = update(newState, {
            index: {$merge: { status: np.status, updated: np.updated }}
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

Shu*_*tri 5

使用动态密钥时,您需要在[]. 因此,将您包裹index起来[]以访问索引等于的对象,否则它只会在 newState 中index寻找键index

尝试

newProjects.forEach(np => {
    const index = oldProjects.findIndex(op => op.id === np.id);
    if (index === -1) {
        newState = update(newState, {$push: np});
    } else {
        newState = update(newState, {
            [index]: {$merge: { status: np.status, updated: np.updated }}
        });
    }
});
Run Code Online (Sandbox Code Playgroud)