按功能javascript / lodash二进制搜索

对于大多数此类操作,我们使用的是lodash库.我对其他建议持开放态度,但可能只是在导入新的lib之前自己编写函数.

lodash has sortedIndexOf,它在排序数组中执行二进制搜索(返回匹配索引,如果未找到则返回-1).它还有sortedIndexBy,它使用二进制搜索找到插入新元素的索引,您可以在其中指定用于进行排序比较的函数(如果未找到则返回有效索引)

我找不到一个函数来执行查找(仅在找到时返回索引),使用有效的排序搜索,允许您指定排序值函数.它可能看起来像这样:

_.sortedFindBy(array, value, function(x){x.timestamp})

我相信我可以用

var idx = _.sortedIndexBy(array, value, function(x){x.timestamp})
return (array[idx] && array[idx].timestamp === value.timestamp) ? idx : -1

但对于我来说,没有语法上更加紧凑和直观的已经功能丰富的排序搜索功能,我觉得很奇怪.

我错过了lodash文档中的内容吗?是否有内置的方式来更具惯用地做到这一点?或者我应该使用我的额外检查方法?

最佳答案 通过lodash代码读取,看起来它有一对函数来搜索插入元素的最小索引,同时保持数组排序 – sortedIndex和sortedIndexBy.前者采用数组和值,后者也接受iteratee – 一个为每个元素调用的函数.注意,还有sortedLastIndex和sortedLastIndexBy.那些寻找插入值的最后一个索引.

当检查元素是否在数组中并返回其索引时,没有接受迭代的函数,只是一个孤独的sortedIndexOf. sortIndexOfBy(命名在这里开始变得棘手),接受iteratee以及sortedLastIndexOfBy是合乎逻辑的.

我喜欢你命名为sortedFindBy的想法,并将尝试与sortedLastFindBy一起实现它,并向lodash添加一个拉取请求.

您的额外检查解决方案现在完全正常,并利用二进制搜索优化,而不是添加太多的额外代码.

将来,当sortedFindBy包含在lodash中时,您始终可以将代码交换为新的函数调用.

_.sortedFindBy(array, value, function(x){x.timestamp})

但是,您不会发现代码性能有任何差异.

点赞