可以比克隆数组,推送项目和排序更快地完成吗?
我有一个array
个项目,以及一个不属于数组的item
:
let array = [
{name: 'Foo'},
{name: 'Bar'},
{name: 'Quux},
]
let item = {name: 'Baz'}
数组按字母顺序排序:
array = _.sortBy(array, 'name')
与vanilla JS相同:
function compare ({name: a}, {name: b}) {
return (
a < b ? -1 :
a > b ? 1 :
0
)
}
array.sort(compare)
我的目标是确定item
如果被推入array
并且array
以相同的方式再次排序,那么function getProposedItemIndex (array, item) {
let tempArray = array.slice() // copy the array, we don't want to mutate the existing one
tempArray.push(item)
tempArray.sort(compare) // or `tempArray = _.sortBy(tempArray, 'name')`
return tempArray.indexOf(item)
}
会在哪个索引处结束。< /强>
一个明显的解决方案是尝试看看:
for (let i; i>array.length; i++) {}
但这似乎不是最佳的。
有没有办法有效地做到这一点,同时保持代码简洁易读? I. e。不难理解像Sub insertRow()
Dim i As Long
For i = 1 To Range("D18").Value
Range("A20").EntireRow.Insert
Next i
End Sub
这样的东西。一条lodash链将是理想的。
答案 0 :(得分:3)
var index=0;
while(compare(array[index],item)>0) index++;
if(index===array.length) index=-1;
行动中:
let array = [
{name: 'Foo'},
{name: 'Bar'},
{name: 'Quux'},
].sort(compare);
let item = {name: 'Baz'};
function compare ({name: a}, {name: b}) {
return (
a < b ? -1 :
a > b ? 1 :
0
)
}
var index=0;
while(compare(array[index],item)>0) index++;
if(index===array.length) index=-1;
console.log(index);
答案 1 :(得分:1)
假设array
已排序,那么我们可以使用lodash#sortedIndexBy
来获取索引。
var index = _.sortedIndexBy(array, item, 'name');
let array = [
{name: 'Bar'},
{name: 'Foo'},
{name: 'Quux'},
];
let item = {name: 'Baz'};
var index = _.sortedIndexBy(array, item, 'name');
console.log(index);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>