如何在JavaScript的map函数中返回追加新属性的对象?
解决方法
你的推测完全正确:map 函数的回调必须返回值,否则默认返回 undefined,这就是result数组全是undefined的原因。虽然你已经成功给原student对象追加了属性,但没把处理后的对象返回给map,所以无法生成正确的结果数组。
有两种常见的处理方式:
方式一:返回修改后的原对象(会修改原数组)
直接在map回调末尾返回处理后的student对象即可:
const result = students.map((student) => { student.classRoomNo2016 = getHistoricalData(student, 2016, 'classRoomNo') student.marks2016 = getHistoricalData(student, 2016, 'marks') student.classAttended2016 = getHistoricalData(student, 2016, 'classAttended') return student; // 新增:返回处理后的对象 })
这种方式会直接修改原responseData.students里的元素,适合允许修改原数据的场景。
方式二:返回新对象(不修改原数据,推荐)
用对象扩展运算符复制原对象的所有属性,再添加新属性,避免修改原数据产生副作用:
const result = students.map((student) => { return { ...student, classRoomNo2016: getHistoricalData(student, 2016, 'classRoomNo'), marks2016: getHistoricalData(student, 2016, 'marks'), classAttended2016: getHistoricalData(student, 2016, 'classAttended') }; })
额外优化:简化getHistoricalData函数
当前函数用map遍历后取第一个有效结果,效率较低,改用find可以直接找到第一个符合条件的历史数据,更高效:
const getHistoricalData = (student, year, key) => { const targetData = student.historyDataList.find(item => { return item.shivirdetails && item.shivirdetails.year == year && item[key]; }); return targetData ? targetData[key] : undefined; }
内容的提问来源于stack exchange,提问作者Vikash Sharma
相关产品推荐
相关产品推荐

