javascript - Js展开运算符和嵌套数组

标签 javascript ecmascript-6 redux spread-syntax

我有以下对象

state = {"line": [
   {"media": [1, 2, 3 ]},
   {"media": []},
   {"media": []},
]}

我需要的是删除媒体数组中的元素。

我尝试以下操作

return {
            ...state, line: [{
                ...state.line[line_index], media = [
                        ...state.line[line_index].media.slice(0, action.payload.index),
                        ...state.line[line_index].media.slice(action.payload.index + 1)
                ]
            }]
        }

但它不起作用,它用对象替换了媒体。

我不知道如何正确地做到这一点。有人可以指路并描述一下吗

最佳答案

你忘记的是正确地重新组装线阵列。尝试像这样分解它:

const changedElement = {
    ...state.line[lineIndex],
    media: [
        ...state.line[lineIndex].media.slice(0, action.payload.index),
        ...state.line[line_index].media.slice(action.payload.index + 1)
    ]
}

return {
    ...state,
    line: [
        ...state.line.slice(0, line_index),
        changedElement,
        ...state.line.slice(line_index + 1)
    ]
}

你想要做的是写下你的状态的当前结构:

state = {
    line: [
        {
            media: []
        },
        {
            media: []
        }
    ]
}

然后您可以做的就是使其通用并包含状态。因此,state 应该是 state 的副本(通过将 ...state 放入其中),并且 line 应该是 line 的副本。 linestate 之间的唯一区别是它是一个数组。制作数组的不可变副本比制作对象的副本要复杂一些。但在您的代码中,您已经为 changedElement 执行了此操作。

要进一步阅读此内容,您应该查看不可变更新模式,因为这些只是您可以随时重复使用的配方:https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns

关于javascript - Js展开运算符和嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055839/

相关文章:

php - 使用 php 和 javascript 的购物车,无需数据库

javascript - 汇总: "Import of non-existent export" when importing function from Lodash

javascript - 如何显示来自 redux store 的数据?

reactjs - react Redux : Component not updated after connecting to redux

javascript - 有没有一种简单的方法可以同时实现两个 jQuery 效果?

javascript - react : Axios Network Error

javascript - Webpack 无法正确解析我的别名

javascript - Redux中如何处理关系数据?

javascript - javascript中许多构造函数参数的替代方法

javascript - ReactCSSTransitionGroup componentWillLeave 未调用