我正在考虑如何最好地使用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
明显更高效,是否有一种干净,无点的方式来编写此代码?
答案 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()
。