javascript - ImmutableJS - 插入嵌套数组

标签 javascript immutability immutable.js

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)
});

https://jsbin.com/midimupire/edit?html,js,console

结果:

Error: invalid keyPath

我认为也许我需要将 subList 设置为 List();我在尝试此操作时遇到了同样的错误。

最佳答案

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

{
  id : 1,
  subList: [
    {name: "sublist item"}
  ]
}

为此,我们需要进行一些更改。

  1. 使用Immutable.fromJS将普通的 JS 对象数组深度转换为不可变的映射列表

  2. 使用List.update()返回具有更新值的新 List

  3. 使用Map.updateIn()返回具有更新值的新 LMapist

这是整个事情:

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

let collection = Immutable.fromJS(items);

collection = collection.update(0, item => {
  return item.updateIn(['subList'], subList => {
    return subList.concat(newItem);
  });
});

console.log(collection)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>

结果:

[
  {
    "id": 1,
    "subList": [
      {
        "name": "sublist item"
      }
    ]
  },
  {
    "id": 2,
    "subList": []
  },
  {
    "id": 3,
    "subList": []
  }
]

更新: List.updateIn() 可以使用索引作为键路径,因此您可以将其简化为以下内容:

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

像这样:

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

let collection = Immutable.fromJS(items);

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

console.log(collection)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>

关于javascript - ImmutableJS - 插入嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646920/

相关文章:

javascript - 如何使用 Excel Javascript Addins 计算所有非空白单元格?

javascript - 您可以通过 JavaScript 将媒体查询特定样式应用于 HTML 元素吗?

python - 在 stackless python 中,通过 channel 发送的数据是不可变的吗?

haskell - 用于大量串联和单次迭代的最快不可变列表数据结构

java - Java 的不可变 TreeMap ?

javascript - 我是否必须忽略 Immutable JS 的全局模块状态的概念?

javascript - Immutable.js:导出到数组时如何保持不变性?

javascript - firefox 25 没有为音频标签定义 play() ?

javascript - 隐藏html页面源

不可变默认参数值的 Python 行为