如何将新项目推入immutableJS中的深层嵌套记录

时间:2016-03-03 17:24:16

标签: javascript arrays list immutable.js

我试图将新项目推送到深层嵌套的不可变记录中。

  const i = Immutable.Record({
    nested: new (Immutable.Record({
      someKey: [{id:1,name:'adam'}, {id:2,name:'steve'}],
    })),
  });
  const myMap = new i;
  const myNewMap = myMap.updateIn(['nested', 'someKey'], (fav)=>    fav.push({id:3,name:'dan'}));

  console.log(myNewMap.toJS());

我期望用新值更新嵌套列表,但实际输出是

  [object Object] {
  nested: [object Object] {
    someKey: 3
    }
  }

所以我做错了什么,那么如何用新值更新记录呢?

这里是jsbin的例子 http://jsbin.com/nipolimuyu/edit?html,js,console

2 个答案:

答案 0 :(得分:2)

您在传递给return的函数中缺少updateIn语句(请注意,Array.push不会返回结果数组!)。它应该是:

const myNewMap = myMap.updateIn(
  ['nested', 'someKey'], 
  (fav) => {
    fav.push({id:3,name:'dan'})
    return fav
  })

答案 1 :(得分:0)

这里要小心。

你的初始obj都应该是一个不可变的对象。你可以使用fromJS()。

在您的示例中,您需要将数组添加为ImmutableJS列表

const i = Immutable.Record({
    nested: new (Immutable.Record({
    someKey: new Immutable.List([{id:1,name:'adam'}, {id:2,name:'steve'}]),
  })),
});
// The bad way, add a normal JS array to an immutableJS Record/map
const i = Immutable.Record({
    nested: new (Immutable.Record({
    someKey: [{id:1,name:'adam'}, {id:2,name:'steve'}],
  })),
});

所以最后你只需要做你想要的事情

const myNewMap = myMap.updateIn(['nested', 'someKey'], fav => fav.push({id:3,name:'dan'}));

所以现在你可以使用返回一个新的immutableJS对象的immutableJS push()函数。