jed*_*ikb 3 javascript arrays sorting lodash
看来lodash的sortedIndex需要一个正向排序数组才能进行二分搜索。(例如[0,1,2,4])
当数组反向排序时,有没有办法使用sortedIndexBy?(例如[4,2,1,0])?
> _.sortedIndex( [0,1,2,4], 3 )
> 3
> _.sortedIndex( [4,2,1,0], 3 )
> 4
Run Code Online (Sandbox Code Playgroud)
为了让它现在工作,我必须反转数组,找到排序索引,插入新元素,然后取消反转数组。
注意——需要能够对字符串和数字进行排序的东西。
['A','B','D']到['D','B','A']并插入'C'.
_.sortedIndexBy怎么样?
编辑:为了string进行比较,String.prototype.charCodeAt()可以帮助您将其转换为Number,然后可以应用相同的逻辑。
const arr1 = [0, 1, 2, 4];
const arr2 = [4, 2 ,1, 0];
console.log(_.sortedIndex(arr1, 3 ));
// Similar, but with ranking function.
console.log(_.sortedIndexBy(arr2, 3, function(x) {return -x;}));
const charArr = ['D','B','A'];
// Take the first char and convert to Number
let index = _.sortedIndexBy(charArr, 'C', function(x) {
// Type checks. (If you want it to be general to many types..
if (typeof x === 'string') {
return -x.charCodeAt(0);
} else if (typeof x === 'number') {
return -x;
} // else ... for other types.....
});
console.log('To insert char C, put it to index: ', index);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>Run Code Online (Sandbox Code Playgroud)
或者通过_.sortedIndex,它也有 iteratee 排名在 4.0.0 之前
const arr1 = [0, 1, 2, 4];
const arr2 = [4, 2 ,1, 0];
console.log(_.sortedIndex(arr1, 3));
console.log("Reversed order without ranking func: ",_.sortedIndex(arr2, 3));
// Ranking function to inverse the order.
console.log("Reversed order with ranking func: ",_.sortedIndex(arr2, 3, function(x) {return -x;}));Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.3.1/lodash.min.js"></script>Run Code Online (Sandbox Code Playgroud)
感谢 pilau:sortedIndex 期望数组是正向排序的,所以我们不能只放置反向排序的数组并 get arr.length - index,为了处理不同的情况,我认为我们需要这样做
arr.length - index-> 插入原始数组。达到预期的效果。