Immutable.js在嵌套对象中推入数组

Ale*_*rev 19 javascript immutable.js

假设有一个对象:

const object = {
  'foo': {
    'bar': [1, 2, 3]
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要推4送到object.foo.bar阵列.

现在我这样做:

const initialState = Immutable.fromJS(object)
const newState = initialState.setIn(
  ['foo', 'bar', object.foo.bar.length],
  4
)
console.log(newState.toJS())
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢它,因为我需要object.foo.bar.length在路径中使用它.在我的真实示例中,对象嵌套得更深,并且获取数组的长度看起来非常难看.还有另一个更方便的方法吗?

zer*_*kms 36

这应该工作

initialState.updateIn(['foo', 'bar'], arr => arr.push(4))
Run Code Online (Sandbox Code Playgroud)

参考文献:

  • [arr.push](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push) 是错误的,因为它返回新数组的 /length/ 。这将导致 {foo: { bar: 3}}。你想使用 [arr.concat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) (3认同)
  • `arr.push` 在这里是正确的,但命名有点误导:示例中的 `arr` 是 Immutable 的 List,因为 OP 通过 `Immutable.fromJS` 创建了状态。`List.push` 返回一个附加了参数的新列表,所以这正是 OP 所要求的。 (2认同)

Huy*_*yen 6

我正在使用seamless-immutable,当我向嵌套对象数组中添加新项目时,出现以下错误:

不能在不可变数据结构上调用push方法。

我的数组仍然有push方法,但是不起作用。解决方案是改用concat,有关#43的更多详细信息:

initialState.updateIn(['foo', 'bar'], arr => arr.concat([4]));
Run Code Online (Sandbox Code Playgroud)

希望有帮助!