如何用不可变的js取消列表中每个元素?

时间:2018-02-14 19:12:45

标签: javascript list reactjs redux immutability

我想在不可变列表

中取消移动数组的每个元素

我的执行导致以下结果。 enter image description here

- >列表[List [new_element],element,element,element]

我想要这个结果。

- >列出[new_element,element,element,element]

我该如何解决?

case types.MEMO_LIST_SUCCESS:

    if (action.listType === 'new') {        
        if(action.data.length !== 0) {
            return state.setIn(['memoList', 'status'], 'SUCCESS')
                                .setIn(['memoList', 'data'], data.unshift(fromJS(action.data)));
        } else {
            return state.setIn(['memoList', 'status'], 'SUCCESS')
        }
    }

1 个答案:

答案 0 :(得分:0)

从代码示例中的表达式action.data.length看,您应该迭代action.data并将每个项目添加到data

  

如果action.data是一个数组或其他可迭代,fromJS(action.data)会返回一个新的List

您可以使用Array.prototype.reduce并传递data作为积累的初始值,通过迭代action.data添加{<1}}:

if (action.listType === 'new') {
    const newData = action.data.reduce((acc, item) => acc.unshift(fromJs(item)), data);
    return state
        .setIn(['memoList', 'status'], 'SUCCESS')
        .setIn(['memoList', 'data'], newData);
}

或者更简单,使用List::concat方法。

请注意,上面的示例反转了action.data中项目的顺序,而以下示例没有。

如果是一个数组resp,上面的例子确实将每个item转换为不可变ListMap。对象,而以下示例没有。

if (action.listType === 'new') {
    return state
        .setIn(['memoList', 'status'], 'SUCCESS')
        .setIn(['memoList', 'data'], fromJS(action.data).concat(data));
}