【发布时间】:2017-07-11 15:21:20
【问题描述】:
能比克隆数组、推送项目和排序更快吗?
我有一个 array 的项目,还有一个不属于数组的 item:
let array = [
{name: 'Foo'},
{name: 'Bar'},
{name: 'Quux},
]
let item = {name: 'Baz'}
数组按字母顺序排序:
array = _.sortBy(array, 'name')
与原版 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++) {}。一个 lodash 链将是理想的。
【问题讨论】:
-
输入数组在添加新元素之前是否已经排序?然后你需要做的就是遍历现有数组,并检查你的新项目何时变得比当前的“更大”,此时你可以跳出循环......
标签: javascript arrays sorting ecmascript-6 lodash