JavaScript遍历修改对象数组仅返回首个对象如何解决
问题说明
- 待处理原数组
jsonStudent内容:
[ { Student: 'Riya', Gender: 'Female', Pet: 'Timmy' }, { Student: 'Happy', Gender: 'Male', Pet: 'Harry' }, { Student: 'Tiya', Gender: 'Female', Pet: 'Timmy' }, ]
- 处理规则:
- 字段重命名:
Student→name、Gender→gender、Pet→pet - 新增固定字段
isActive,值为true - 新增时间字段
createdAt、updatedAt,值为处理时刻的当前时间
- 字段重命名:
- 期望输出:
[ { name: 'Riya', gender: 'Female', pet: 'Timmy', isActive: true, createdAt: 2022-06-28T17:55:53.907Z, updatedAt: 2022-06-28T17:55:53.907Z }, { name: 'Happy', gender: 'Male', pet: 'Harry', isActive: true, createdAt: 2022-06-28T17:55:53.913Z, updatedAt: 2022-06-28T17:55:53.913Z }, { name: 'Tiya', gender: 'Female', pet: 'Timmy', isActive: true, createdAt: 2022-06-28T17:55:53.919Z, updatedAt: 2022-06-28T17:55:53.919Z } ]
故障原因
原有代码存在两处问题:
for循环缺少闭合的右大括号,循环体没有正确闭合,执行完第一次迭代后就终止,无法遍历全部数组元素- 没有定义结果数组收集每个元素的处理结果,仅在循环内打印单个对象,无法得到完整的目标数组
原有未完成的代码片段:
console.log(jsonStudent); for (var i = 0; i < jsonStudent.length; i++) { const nameVal = jsonStudent[i].Student; const genderVal = jsonStudent[i].Gender; const petVal = jsonStudent[i].Pet; const now = new Date(); const input = { name: nameVal, gender: genderVal, pet: petVal, }; input.isActive = true; input.createdAt = now; input.updatedAt = now; console.log(input);
修正代码
推荐写法(map遍历)
用数组原生map方法直接生成处理后的新数组,逻辑更简洁,不需要手动维护循环索引:
const result = jsonStudent.map(student => { const currentTime = new Date(); return { name: student.Student, gender: student.Gender, pet: student.Pet, isActive: true, createdAt: currentTime, updatedAt: currentTime } }); console.log(result);
兼容原有for循环写法
如果要保留原有的for循环逻辑,补全循环闭合括号,新增结果数组收集每次循环的处理对象即可:
console.log(jsonStudent); const result = []; for (var i = 0; i < jsonStudent.length; i++) { const nameVal = jsonStudent[i].Student; const genderVal = jsonStudent[i].Gender; const petVal = jsonStudent[i].Pet; const now = new Date(); const input = { name: nameVal, gender: genderVal, pet: petVal, isActive: true, createdAt: now, updatedAt: now }; result.push(input); } console.log(result);
补充:如果需要输出和示例完全一致的ISO标准时间字符串,将代码中
new Date()替换为new Date().toISOString()即可。
内容的提问来源于stack exchange,提问作者Tina
相关产品推荐
相关产品推荐

