将单个元素添加到不可变列表

时间:2017-08-21 15:50:09

标签: immutable.js

我想在我的不可变对象树中的某个地方添加一个元素。

这个问题似乎已在这里得到解答:

Append value to List

但由于某种原因,它对我不起作用。

如果我有以下代码:

var myState = {
  a: {
    b: {
      c: [
        {name: 'hi', value: 2},
        {name: 'howdy', value: 3}
      ]
    }
  }
}
myState = Immutable.fromJS(myState);
myState = myState.update(['a', 'b', 'c'], function (myList) {
  myList.push({"name": "hallo", "value": 4})
  }
);

我收到错误:

  

未捕获的TypeError:无法读取属性' push'未定义的

表示传递给回调的myList参数为null。

为什么会这样?

小提琴:

https://codepen.io/owatkins/pen/brMava

2 个答案:

答案 0 :(得分:1)

这是应该写的:

@BeforeEach

以下是一个工作示例:

myState.updateIn(['a', 'b', 'c'], function (myList) {
    return myList.push({"name": "hallo", "value": 4})
  }
);
var myState = Immutable.fromJS({
  a: {
    b: {
      c: [{
          name: 'hi',
          value: 2
        },
        {
          name: 'howdy',
          value: 3
        }
      ]
    }
  }
})

myState = myState.updateIn(['a', 'b', 'c'], function(myList) {
  return myList.push({
    "name": "hallo",
    "value": 4
  })
});

console.info('myState = ' + myState.toJS())

请注意我使用<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>代替updateIn并返回update的结果

答案 1 :(得分:-1)

经过多次填充,我能想到的唯一解决方案是获取数组,转换为JS,将元素推送到它上面,然后将其转换回不可变的...然后使用 setIn ,不是 updateIn ,而不是更新

var myState = {
  a: {
    b: {
      c: [
        {name: 'hi', value: 2},
        {name: 'howdy', value: 3}
      ]
    }
  }
}
myState = Immutable.fromJS(myState);

var list = myState.getIn(['a', 'b', 'c'])
var list = list.toJS();

list.push({"name": "hallo", "value": 4});

var v = Immutable.fromJS(list)

myState = myState.setIn(['a', 'b', 'c'], v)

这看起来像一个可怕的解决方案,但它是迄今为止唯一对我有用的东西。

通常需要大约5分钟的时间来学习如何在框架或语言中将元素添加到列表中。

我不希望它花费5 HOURS

此框架的文档绝对是一种耻辱。