【问题标题】:Should I use delete and findIndex or filter to remove and item from an immutable.js List?我应该使用 delete 和 findIndex 还是过滤器从 immutable.js 列表中删除和项目?
【发布时间】:2016-08-02 17:50:49
【问题描述】:

我正在考虑如何最好地使用 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 的性能明显更高,是否有一种简洁、无点的方式来编写此代码?

【问题讨论】:

    标签: javascript immutable.js pointfree


    【解决方案1】:

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

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

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

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

    所以我会坚持使用更简洁的代码,如果 filter() 不能随您的应用程序数据扩展,则切换到 findIndex()delete()

    【讨论】:

      【解决方案2】:

      正如亚当所说,findIndex 可能不会遍历整个列表,但我的建议是使用 Map 而不是 List,id 是关键。那么你有 O(1) 的时间复杂度,删除条目也更加清晰和可读。

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 2020-08-17
        • 1970-01-01
        • 2017-04-06
        • 1970-01-01
        • 2020-08-31
        • 2013-04-22
        • 2014-06-29
        • 1970-01-01
        相关资源
        最近更新 更多