如何为对象数组中的每一项新增对应数组下标的index字段?
为对象数组元素追加对应位置索引字段的实现方式
核心逻辑很简单:在遍历数组的过程中,拿到每个元素对应的位置索引值,将索引作为自定义字段绑定到对应对象上即可,以下是两种最常用的实现方案,适配不同的开发场景。
方案1:使用map方法生成全新数组(推荐,无副作用)
这种方式不会修改原始数组的内容,符合不可变数据的开发规范,适合对数据状态稳定性要求较高的业务场景。map方法的回调会自动传入两个核心参数:当前遍历到的对象、当前对象在数组中的索引值,我们只需要基于原对象生成带索引字段的新对象即可:
const input = [ { a: 1 }, { a: 2 }, { a: 7 } ]; // 生成带index字段的新数组,原数组完全不受影响 const output = input.map((item, index) => { // 展开原对象所有属性,追加index字段 return { ...item, index } });
这种实现的特点:
- 不会改动原始数组和内部对象的状态,没有副作用
- 返回值就是最终的目标数组,不需要额外的变量拼接操作
- 适配函数式编程的开发习惯,链式调用时也不会有状态污染
小优化:当对象属性名和保存索引的变量名完全一致时,可以省略冒号和重复赋值,代码会更简洁。
方案2:使用forEach方法直接修改原对象
如果不需要保留原始数组的结构,完全可以在遍历过程中直接给现有对象追加索引字段,写法更直接:
const input = [ { a: 1 }, { a: 2 }, { a: 7 } ]; input.forEach((item, index) => { // 直接给当前对象挂接index字段 item.index = index; });
注意:这种写法会直接修改内存中的原始对象,如果这些对象还被其他业务逻辑引用,可能引发非预期的状态变更,使用时需要确认场景边界。
常见写法补充
如果使用for...of语法遍历数组,没法直接拿到索引值,需要配合entries()方法同时获取数组的索引和元素值:
const input = [ { a: 1 }, { a: 2 }, { a: 7 } ]; for (const [index, item] of input.entries()) { item.index = index; }
内容的提问来源于stack exchange,提问作者Martin Mucha
相关产品推荐
相关产品推荐

