使用immutablejs在数组中深入删除

时间:2018-01-09 07:17:39

标签: immutable.js

我正在尝试在Immutablejs中执行复杂的删除,没有,我似乎总是这么做,在过程中转换为JS。

在以下数组中,我想删除每隔一个{y: }对象

series: [
  {
    name:"1",
    data: [
      {y: 1},
      {y: 2},
      {y: 3}
    ]
  },
  {
    name:"2",
    data: [
      {y: 1},
      {y: 2},
      {y: 3}

    ]
  },
  {
    name:"3",
    data: [
      {y: 1},
      {y: 2},
      {y: 3}

    ]
  }
]

所以我会得到这个:

series: [
  {
    name:"1",
    data: [
      {y: 1},
      {y: 3}
    ]
  },
  {
    name:"2",
    data: [
      {y: 1},
      {y: 3}

    ]
  },
  {
    name:"3",
    data: [
      {y: 1},
      {y: 3}
    ]
  }
]

有人能指出我正确的方向如何使用 ImmutableJS 吗?如果我只是使用过滤器或数组减少,我可以得到一个非常干净的解决方案,如下所示:

series.forEach(function (elem) {
  let data = elem.data;
  data.splice(index, 1);
});

我只是希望不变的有一个同样干净的解决方案。

removeIn的文档不够深入: https://facebook.github.io/immutable-js/docs/#/removeIn

2 个答案:

答案 0 :(得分:1)

您正在修改series的每个元素,因此我认为您使用.map()进入了正确的轨道。然后你想使用.removeIn来深深删除某些东西。

let seriesList = Immutable.fromJS(series)
seriesList = seriesList.map(elem =>
  elem.removeIn(['data', indexToRemove]));

// equivalent form with .update() instead of .removeIn()
seriesList = seriesList.map(elem =>
  elem.update('data', data => data.remove(indexToRemove)));

答案 1 :(得分:0)

我设法使用' map'来自不可变列表。这对我有用:

seriesList  = Immutable.List(seriesList);

seriesList = seriesList.map(
  elem => {
    let data = elem.getIn(['data'])
    data = data.remove(index)
    elem = elem.setIn(['data'], data)

    return elem
  })

任何人都有更好的东西吗?