HOWTO · JavaScript
在 JavaScript 数组中查找对象的索引
这篇文章解释了在 JavaScript Array 中查找对象索引的方法
本页内容
使用原生 findIndex() 方法,可以查找数组中第一个符合条件的对象的位置。例如,谓词可以比较对象的 name、id 或 role 属性。findIndex() 返回一个数字:匹配对象在数组中的索引;如果没有对象匹配,则返回 -1。它不会返回对象本身。
使用 findIndex() 查找对象的索引
在数组上调用 findIndex(),并传入一个在匹配时返回真值的回调函数。下面的示例会在人员数组中查找第一位编辑,并记录该方法检查了哪些位置:
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
const people = [
{ name: "Mina", role: "author" },
{ name: "Luis", role: "editor" },
{ name: "Ava", role: "editor" },
];
const checkedIndexes = [];
const index = people.findIndex((person, currentIndex) => {
checkedIndexes.push(currentIndex);
return person.role === "editor";
});
console.log(index);
console.log(checkedIndexes.join(", "));
1
0, 1
返回值是 1,因为 Luis 是第一位编辑。Ava 也符合条件,但搜索在找到 Luis 后立即停止,因此不会检查索引 2。这个方法也适用于原始值数组。例如,[3, 10, 17, 23].findIndex(age => age > 18) 会返回第一个大于 18 的年龄所在位置,即 3。
了解 findIndex() 的回调函数和返回值
回调函数首先接收当前数组元素。它还可以按顺序接收当前索引和正在搜索的数组:(currentValue, index, array)。示例使用索引展示搜索顺序;如果谓词需要访问原始集合的上下文,可以使用数组参数。通常,查找对象属性时只需当前元素。
回调函数必须检查你关心的属性。例如,person.role === "editor" 这样的谓词会返回布尔值;较宽泛的条件可能匹配多个对象,但 findIndex() 仍只会报告第一个匹配项。如果回调函数的结果全部为 false,该方法就会返回 -1。将返回值用作数组位置之前,应先检查它是否为 -1,因为 people[-1] 不是最后一项,也无法取得匹配对象。
要直接查找对象,可以比较标识符这类稳定属性:people.findIndex(person => person.id === targetId)。预期值与存储的属性值类型相同时,使用严格相等比较。如果你的目的是取得匹配的对象而不是它的位置,则使用 find();这两个方法都采用谓词进行搜索,但返回值类型不同。
将 Lodash _.findIndex() 用作替代方案
如果项目已经使用 lodash,其 _.findIndex() 函数可以提供类似的查找功能,而不必调用数组方法。可以通过项目的包管理器添加该库,例如 npm i lodash 或 yarn add lodash。Lodash 的 _.findIndex() 文档介绍了谓词简写和相关选项。
先传入数组,再传入谓词。对于上文的 people 数组,_.findIndex(people, { role: "editor" }) 会返回 1;Lodash 会将对象谓词视为属性匹配。条件需要自定义逻辑时,也可以传入 person => person.role === "editor" 这样的函数。可选的 fromIndex 参数用于设置搜索起点:_.findIndex(people, { role: "editor" }, 2) 会从索引 2 开始搜索,因此会在该位置找到 Ava。原生方法的写法是 people.findIndex(predicate),形式有所不同,但两者都会从各自的起始位置返回第一个匹配项的索引;如果后续没有匹配项,则返回 -1。如果项目已经使用 lodash,或者它的谓词简写很实用,可以选择 Lodash;原生方法则无需额外安装库。