You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:16:10