如果项目被放入数组并进行排序,则确定该项目的潜在索引。

时间:2017-07-11 15:21:21

标签: javascript arrays sorting ecmascript-6 lodash

可以比克隆数组,推送项目和排序更快地完成吗?

我有一个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链将是理想的。

2 个答案:

答案 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>