JavaScript按rowId更新或新增数组对象功能异常如何解决
问题原因
- 代码的核心问题是操作对象和返回对象不一致:调用
find方法匹配元素时遍历的是原始入参数组anArray,修改的也是原始数组中的元素,但最后返回的是深拷贝得到的独立新数组arrayCopy,原始数组的修改不会同步到拷贝后的数组中,自然看不到更新效果。 - 额外隐藏问题:现有写法会意外修改原始入参数组,不符合无副作用的函数设计预期。
修正后的代码
function replaceOrAdd(anObject, anArray) { if (anObject == null) { return JSON.parse(JSON.stringify(anArray)); } let arrayCopy = JSON.parse(JSON.stringify(anArray)); // 改为从拷贝后的数组中查找匹配元素 let found = arrayCopy.find(s => s.rowId === anObject.rowId); if (found) { Object.assign(found, anObject); } else { arrayCopy.push(anObject); } return arrayCopy; }
验证效果
使用示例参数调用修正后的函数,返回结果和预期完全一致:
var anArray = [ {rowId:0, a:0, b:5, c:2}, {rowId:1, a:12, b:7, c:2.5} ]; var anObject= {rowId:1, b:9999}; var result = replaceOrAdd(anObject, anArray); // 输出: // [ // {rowId:0, a:0, b:5, c:2}, // {rowId:1, a:12, b:9999, c:2.5} // ]
内容的提问来源于stack exchange,提问作者NickJ
相关产品推荐
相关产品推荐

