Javascript ImmutableJS-推入嵌套数组

Javascript ImmutableJS-推入嵌套数组,javascript,immutability,immutable.js,Javascript,Immutability,Immutable.js,结果: 错误:无效的密钥路径 我认为可能需要将子列表设置为List();尝试此操作时,我会遇到相同的错误。使用获得的对象,更新子数组并返回整个对象 const List = Immutable.List; const items = [ { id: 1, subList: [] }, { id: 2, subList: [] }, { id: 3, subList: [] } ]; const newItem = { name: "sublist item" }; let co

结果:

错误:无效的密钥路径


我认为可能需要将子列表设置为
List()
;尝试此操作时,我会遇到相同的错误。

使用获得的对象,更新子数组并返回整个对象

const List = Immutable.List;
const items = [
  { id: 1, subList: [] }, 
  { id: 2, subList: [] }, 
  { id: 3, subList: [] }
];
const newItem = { name: "sublist item" };

let collection = List(items);

collection = collection.updateIn([0, 'subList'], function (items) {
  return items.concat(newItem)
});

这不起作用,因为
Immutable.List
的元素是普通的旧JavaScript对象(POJO),而不是
Immutable.Map
s,所以
updateIn
不知道如何使用它们。您可以:

  • 使对象
    不可变。使用而不是
    不可变来映射
    s。将
    列表作为构造函数,将整个对象图转换为不可变对象。()
  • 使用
    update([0])
    而不是
    updateIn
    来获取POJO并对其进行变异(如@Navjot的答案)

如果我正确理解了问题,您希望返回
集合
,第一个元素为:

const List = Immutable.List;
const items = [
  { id: 1, subList: [] }, 
  { id: 2, subList: [] }, 
  {id: 3, subList: [] }
];
const newItem = { name: "sublist item" };

let collection = List(items);

collection = collection.update([0], function (obj) {
   obj.subList = obj.subList.concat(newItem)
   return obj;
});
为此,我们需要做一些更改

  • 用于将对象的普通JS数组深度转换为不可变的映射列表

  • 用于返回带有更新值的新
    列表

  • 用于返回具有更新值的新LMapist

  • 事情是这样的:

    const List=Immutable.List;
    常数项=[{
    id:1,
    子列表:[]
    },
    {
    id:2,
    子列表:[]
    },
    {
    id:3,
    子列表:[]
    }
    ];
    常量newItem={
    名称:“子列表项”
    };
    让collection=Immutable.fromJS(items);
    集合=集合。更新(0,项=>{
    return item.updateIn(['subList'],subList=>{
    返回子列表concat(newItem);
    });
    });
    console.log(收集)

    哪个键导致错误?很难说()。通过使用最新的不可变项在本地运行,我知道问题是[0]无法设置将
    updateIn
    更改为
    getIn
    ,然后尝试删除“subList”键。它是否返回第一张地图?
    {
      id : 1,
      subList: [
        {name: "sublist item"}
      ]
    }