如何在JavaScript中通过匹配键添加属性创建新对象数组
解决对象数组匹配并添加属性的问题
看起来你想要实现的是两个对象数组根据code匹配后,给obj1的对应项添加匹配到的obj2的id集合(逗号分隔),同时过滤掉没有匹配的项对吧?你的原代码只完成了筛选的部分,还没实现添加sid属性的逻辑,我来帮你修正一下:
修正后的代码
function mergeArrays(obj1, obj2) { return obj1 .map(item => { // 筛选obj2中所有code与当前obj1项匹配的对象 const matchedItems = obj2.filter(obj => obj.code === item.code); if (matchedItems.length > 0) { // 将匹配到的id提取并拼接成逗号分隔的字符串 const sid = matchedItems.map(match => match.id).join(','); // 返回新对象,避免修改原数组元素 return { ...item, sid }; } return item; }) // 过滤掉没有匹配项(即无sid属性)的元素 .filter(item => 'sid' in item); } var obj1 = [ { id:1, code:"item1", color:"blue" }, { id:2, code:"item2", color: "white" }, { id:3, code:"item3", color: "brown" } ]; var obj2 = [ { id:1, code:"item1", stock: 10 }, { id:3, code:"item1", stock: 20 }, { id:2, code:"item2", stock: 20 } ]; console.log(mergeArrays(obj1, obj2));
代码说明
- 先用
map遍历obj1的每个元素,这样可以对每个元素单独处理并返回新对象(避免修改原数据) - 对每个obj1元素,用
filter在obj2中找出所有code匹配的项,这里直接对比obj.code === item.code比你原代码里的Object.values(obj).includes(code)更高效精准,因为我们明确知道要匹配的是code键 - 如果找到匹配项,就提取这些项的
id,用join(',')拼成逗号分隔的字符串,再通过对象展开运算符{ ...item, sid }添加sid属性 - 最后用
filter移除那些没有sid属性的元素(也就是在obj2中找不到匹配code的项)
运行这段代码后,就能得到你预期的输出:
[ { id:1, code:"item1", color:"blue", sid: "1,3" }, { id:2, code:"item2", color: "white", sid: "2" } ]
(注:这里sid是字符串类型,符合你预期的逗号分隔格式;如果需要数字数组类型,可以去掉join(',')直接保留数组)
内容的提问来源于stack exchange,提问作者Sen
相关产品推荐
相关产品推荐

