从不可变的JS对象中删除属性

时间:2018-10-10 11:53:18

标签: javascript react-native redux

在我的本机应用程序中,我想删除Redux中的js对象的属性。

这是我的代码。

    case SAVE_PLAYLIST:
        const { toPlayListFrom, selectedPlaylist } = action.payload;

        let newPlaylists = // state.savedPlaylists;
            Object.keys(selectedPlaylist).length > 0
                ?  {
                    ...state.savedPlaylists,
                    [toPlayListFrom]: selectedPlaylist
                }
                : delete state.savedPlaylists[toPlayListFrom];

        return {
            ...state,
            savedPlaylists: newPlaylists
        }

在这一行delete state.savedPlaylists[toPlayListFrom]中,它没有按预期删除属性。如何以正确的方式从不可变的js对象中删除属性?

1 个答案:

答案 0 :(得分:1)

您的delete陈述是错误的。该命令通常返回true(在某些情况下,它可能返回false。)

此外,正如T.J.拥挤者,您不想修改state变量。

首先要创建数据的副本,然后在副本上应用删除。

case SAVE_PLAYLIST:
    const { toPlayListFrom, selectedPlaylist } = action.payload;

    let newPlaylists = // state.savedPlaylists;
        Object.keys(selectedPlaylist).length > 0
            ?  {
                ...state.savedPlaylists,
                [toPlayListFrom]: selectedPlaylist
            }
            : ...state.savedPlaylists;

    // only apply a delete to the copy, not the original
    //
    if (Object.keys(selectedPlaylist).length === 0) {
        delete newPlaylists.savedPlaylists[toPlayListFrom]
    }

    return {
        ...state,
        savedPlaylists: newPlaylists
    }

JavaScript中要记住的一件事是对象使用引用。因此,如果您不首先进行复制,则是在更改该对象(或尝试至少将某些对象标记为不可变的(实际上是const,因此无法对其进行修改)。)

我确定有多种方法可以优化上面的代码。