使用 immutablejs 深入删除数组

Deleting deep in an array with immutablejs

我正在尝试在 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 做到这一点?如果我只使用 filter 或 array reduce,我可以得到一个非常干净的解决方案,如下所示:

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

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

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

我设法使用不可变列表中的 '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
  })

有人有更好的东西吗?

您正在修改 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)));