不可变的js地图人口

时间:2015-10-20 08:41:31

标签: javascript immutable.js

我正在尝试填充一个不可变的JS地图。 给定一系列字段和表单,例如

{form: 'Register', fields: ['name','firstname']}

我正试图得到类似的东西:

{ form :
        { name: {
               value: '',
               hasFeedback: false
              },
          firstname: {
                value: '',
               hasFeedback: false
              }
        }
}

我目前的代码:

let newState = state;   
fields.forEach((field) => {
      newState = newstate.setIn([form, field, 'value'], '');
      newState = newstate.setIn([form, field, 'hasFeedback'], false);
    });     
return newState;

我对整个不可变的事物都是新手:这是填充不可变地图的正确方法吗?我是否违反了任何关于不变性的约定?这是最优雅的方式吗?

1 个答案:

答案 0 :(得分:2)

我不知道任何约定,但最好先创建所需的结构,然后使用Immutable.fromJS进行转换。像你现在一样,逐个应用突变会产生一些不必要的开销。

可能重构您的代码:

var form = fields.reduce((acc, f) => {
        acc.form[f] = {
            value: '',
            hasFeedback: false
        };
        return acc;
    }, {form: {}});

var immutableForm = Immutable.fromJS(form);