按特定条件查找数组内部元素的最后一个索引

Jac*_*cob 14 javascript arrays

假设我有一个对象数组:

[{'a': 'something', 'b':12},
{'a': 'something', 'b':12},
{'a': 'somethingElse', 'b':12},
{'a': 'something', 'b':12},
{'a': 'somethingElse', 'b':12}]
Run Code Online (Sandbox Code Playgroud)

获取元素的最后一个索引的最最干净的方法是什么,其中a的值为'something'.在这种情况下3.有没有办法避免循环...

Raj*_*esh 19

您可以使用findIndex获取索引.这将为您提供第一个索引,因此您必须反转该数组.

var d = [{'a': "something", 'b':12}, {'a': "something", 'b':12}, {'a': "somethingElse", 'b':12}, {'a': "something", 'b':12}, {'a': "somethingElse", 'b':12}]

function findLastIndex(array, searchKey, searchValue) {
  var index = array.slice().reverse().findIndex(x => x[searchKey] === searchValue);
  var count = array.length - 1
  var finalIndex = index >= 0 ? count - index : index;
  console.log(finalIndex)
  return finalIndex;
}

findLastIndex(d, 'a', 'something')
findLastIndex(d, 'a', 'nothing')
Run Code Online (Sandbox Code Playgroud)

  • @IvanLencina array.reverse反转arrray,所以为了防止修改原始数组,我用切片制作了它的副本 (3认同)
  • 它更实用,但切片和反转数组会比向后迭代慢得多 (3认同)
  • 它有效,但我不明白。你对没有参数的切片做了什么?你能给我解释一下逻辑吗? (2认同)

Nic*_*man 9

这是一个可重用的打字稿版本,该版本反映了ES2015 findIndex函数的签名:

/**
* Returns the index of the last element in the array where predicate is true, and -1
* otherwise.
* @param array The source array to search in
* @param predicate find calls predicate once for each element of the array, in descending
* order, until it finds one where predicate returns true. If such an element is found,
* findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
*/
export function findLastIndex<T>(array: Array<T>, predicate: (value: T, index: number, obj: T[]) => boolean): number {
    let l = array.length;
    while (l--) {
        if (predicate(array[l], l, array))
            return l;
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

  • 没有副本,没有反向,没有无用的过滤器,O(n)。确定的。 (11认同)
  • 问题是用js问的,所以答案应该用js,即使ts和js是可以转换的。像:/sf/answers/2328830381/ (6认同)

Nin*_*olz 6

您可以从头开始迭代,如果找到则退出循环。

var data = [{ a: 'something', b: 12 }, { a: 'something', b: 12 }, { a: 'somethingElse', b: 12 }, { a: 'something', b: 12 }, { a: 'somethingElse', b: 12 }],
    l = data.length;

while (l--) {
    if (data[l].a ==='something') {
        break;
    }
}

console.log(l);
Run Code Online (Sandbox Code Playgroud)

  • 不,不是没有任何循环。并且与右边的其他阵列方法没有短路。 (4认同)

Art*_*sun 6

反转数组对我来说听起来不是很简单,所以我对我非常相似的情况的解决方案是使用map()and lastIndexOf()

var lastIndex = elements.map(e => e.a).lastIndexOf('something');
Run Code Online (Sandbox Code Playgroud)

更新:来自dupe post的这个答案使它变得更好map(cond).lastIndexOf(true)

更新:虽然这不是最有效的解决方案,因为我们必须始终遍历所有数组,而如果我们从末尾运行,我们可以在找到第一个匹配项的那一刻结束搜索(@nico-timmerman的答案)。


Amo*_*mar 5

let newArray = yourArray.filter((each)=>{
    return (each.a === something)
});
newArray[newArray.length-1];
Run Code Online (Sandbox Code Playgroud)

你也可以

let reversedArray = yourArray.reverse();
reversedArray.find((each)=>{return each.a === something})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`reverse()`也会更改`yourArray`(这是就地破坏性操作)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse (2认同)

Ran*_*ner 5

更新-Array.prototype.findLastIndex现已可供使用-

var d = [{'a': "something", 'b':12}, {'a': "something", 'b':12}, {'a': "somethingElse", 'b':12}, {'a': "something", 'b':12}, {'a': "somethingElse", 'b':12}]

const lastIdx = d.findLastIndex(n => n.a === 'something');
console.log(lastIdx);
Run Code Online (Sandbox Code Playgroud)

**使用前请查看此链接以了解支持哪些浏览器findLastIndex

您也可以使用reverseand来实现此目的findIndex,但性能不如使用findLastIndex

var d = [{'a': "something", 'b':12}, {'a': "something", 'b':12}, {'a': "somethingElse", 'b':12}, {'a': "something", 'b':12}, {'a': "somethingElse", 'b':12}]

const lastIdx = d.reverse().findIndex(n => n.a === 'something');

console.log(lastIdx);
Run Code Online (Sandbox Code Playgroud)

findLastIndex - https://github.com/tc39/proposal-array-find-from-last

findIndex - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

反向- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse