如何获取JSON对象数组中指定name属性的最后索引?
嘿,这个问题我之前也碰到过!findIndex()确实只能返回第一个匹配项的索引,要找最后一个符合条件的元素索引,有几种简单又实用的方法,我给你详细说说:
方法1:反转数组后使用
findIndex() 这个思路很直观:先创建原数组的浅拷贝并反转,找到反转后第一个匹配的索引,再通过原数组长度计算出原数组的最后匹配索引。这样既利用了熟悉的findIndex(),又不会修改原数组。
var arr = [{name:"Steve",toppedIn:"Biology"}, {name:"Carol",toppedIn:"Maths"}, {name:"Steve",toppedIn:"Chemistry"}]; function findLastIndex(arr, targetName) { // 用slice()创建浅拷贝,避免反转修改原数组 const reversedArr = arr.slice().reverse(); const reversedIndex = reversedArr.findIndex(item => item.name === targetName); // 没找到返回-1,否则计算原数组索引 return reversedIndex === -1 ? -1 : arr.length - 1 - reversedIndex; } // 测试用例 console.log(findLastIndex(arr, "Steve")); // 输出2,符合预期 console.log(findLastIndex(arr, "Carol")); // 输出1 console.log(findLastIndex(arr, "Bob")); // 输出-1(未找到)
方法2:从数组末尾倒序遍历
直接手动从最后一个元素开始循环检查,找到第一个匹配的就返回索引。这种方法不需要额外创建数组拷贝,效率很高,逻辑也一目了然。
var arr = [{name:"Steve",toppedIn:"Biology"}, {name:"Carol",toppedIn:"Maths"}, {name:"Steve",toppedIn:"Chemistry"}]; function findLastIndex(arr, targetName) { // 从数组最后一位开始往前遍历 for (let i = arr.length - 1; i >= 0; i--) { if (arr[i].name === targetName) { return i; // 找到就立刻返回,不用继续循环 } } return -1; // 遍历完都没找到,返回-1和findIndex保持一致 } // 测试用例 console.log(findLastIndex(arr, "Steve")); // 2 console.log(findLastIndex(arr, "Carol")); // 1
方法3:使用
reduceRight() 如果你喜欢函数式编程风格,reduceRight()是个不错的选择。它会从数组的最后一个元素开始遍历,我们可以利用它来跟踪最后一个匹配的索引:
var arr = [{name:"Steve",toppedIn:"Biology"}, {name:"Carol",toppedIn:"Maths"}, {name:"Steve",toppedIn:"Chemistry"}]; function findLastIndex(arr, targetName) { // 初始值设为-1,表示还没找到匹配项 return arr.reduceRight((lastMatchedIndex, item, currentIndex) => { // 如果还没找到,且当前项符合条件,就更新索引;否则保持原有值 return lastMatchedIndex === -1 && item.name === targetName ? currentIndex : lastMatchedIndex; }, -1); } // 测试用例 console.log(findLastIndex(arr, "Steve")); // 2
内容的提问来源于stack exchange,提问作者aeshna Kashyap
相关产品推荐
相关产品推荐

