我应该使用delete和findIndex或filter来从immutable.js列表中删除项目吗?

时间:2016-08-02 17:50:50

标签: javascript immutable.js pointfree

我正在考虑如何最好地使用Immutable.js。我看到了一些像这样的代码:

state.update('something', something =>
 something.delete(
   something.findIndex(x => x.id === 1)
 )
)

在我看来,使用过滤器可以更清晰地编写这些代码:

state.update('something', something =>
 something.filter(x => x.id !== 1)
)

它甚至可以是无点的:

propEq = k => v => x => x[k] === v
state.update('something', propEq('x', 1))

这里有没有重大的表现权衡?

如果delete + findIndex明显更高效,是否有一种干净,无点的方式来编写此代码?

2 个答案:

答案 0 :(得分:1)

正如亚当所说,findIndex不会迭代整个列表,但我的建议是使用Map代替List,其中id是关键。然后你有O(1)的时间复杂度,并且删除条目也更加清晰和可读。

答案 1 :(得分:0)

我喜欢你的过滤方法。我可能会调整谓词以使用filterNot(),尽管这只是个人品味而不是:

state.update('something', something =>
  something.filterNot(x => x.id === 1)
)

唯一的关注点是过滤意味着你必须遍历整个列表,无论如何。对于较小的列表,这不是什么大问题,但是对于较大的列表,可能会出现明显的性能下降。

例如,在10,000个项目的列表中,findIndex()可能会赢得10,000次迭代,而filter()将总是迭代10,000次。

因此,如果findIndex()无法与您的应用数据进行扩展,我会坚持使用更干净的代码,切换到delete()filter()