构造Redux状态对象

时间:2017-01-28 18:18:53

标签: javascript reactjs redux

我是redux的新手,而且我在设计redux状态的形状时非常困难。我当前的redux状态部分看起来像这样

邀请reducer:

invitees: [{
    '_id': '626262',
    'name': 'xyz'
}, {
    '_id': '6262',
    'name': 'jsjsj'
}, {
    '_id': '626',
    'name': 'gdgdg'
}
....
]

我应该像这样保留这个对象,还是应该保留id并将其作为一个关键词:

invitees: [626262: {
    'name': 'xyz'
}, 6262: {
    'name': 'jsjsj'
}....]

如果我必须使用第二个选项,我该怎么做?我在几篇博客中读到过第二种选择会有所帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用ReduceObject Spread Operator

将您的回复数组转换为您想要的内容
const data = [
    { id: 1, name: 'name-1' },
    { id: 2, name: 'name-2' },
    { id: 3, name: 'name-3' },
    { id: 4, name: 'name-4' },
    { id: 5, name: 'name-5' }
];

function myReducer({ payload }) {
    return payload.reduce((acc, current) => {
        return Object.assign({}, acc, {
            [current.id]: {
                [current.name]: current.name
            }
        })
    }, {});
}


const newState = myReducer({ payload: data });

console.log(newState);
/**
{
   1: { name: 'name-1' }
   2: { name: 'name-2' }
   3: { name: 'name-3' }
   4: { name: 'name-4' }
   5: { name: 'name-5' }
}
*/

答案 1 :(得分:0)

您的第二个示例不是有效的JavaScript对象。你在第二个例子中需要的不是数组,而是像

这样的对象
invitees: {
    '626262': {
       'name': 'xyz'
    }, 
    '6262': {
       'name': 'jsjsj'
    }
    ....
}

第二个例子在某种意义上帮助你,为了获得一个name属性,你不必循环遍历数组的每个元素来搜索id而不是你可以使用{{1来直接访问它记谱法

实施例

brackets