2016-08-02 69 views
0

我在考虑如何最好地使用Immutable.js。我看到一些像这样的代码:我应该使用删除和findIndex或过滤器从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

我喜欢你的过滤方法。我可能会调整到使用filterNot()谓词,虽然这只是个人的品味比什么都重要:

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

唯一PERF担心的是,过滤意味着你必须遍历整个列表,不管是什么。对于较小的列表来说这不是什么大问题,但是对于较大的列表,perf的降级可能是显而易见的。

例如,在10,000个项目的列表中,findIndex()可能不会迭代10,000次,而filter()将始终迭代10,000次。

因此,如果filter()不适合您的应用程序数据,那么我会坚持使用更简洁的代码,切换到findIndex()delete()

1

正如亚当所述,findIndex不会遍历整个列表,但我的建议是使用地图而不是列表,id是关键。然后,您的时间复杂度为O(1),并且删除条目也更清晰可读。