如何在JavaScript中创建嵌套值对象?解决sku元素丢失问题
问题:生成嵌套对象时仅保留最后一个SKU元素,其余丢失
原始数据
[ { "item_id": 696136507565, "seller_id": 2549116888, "sku": [ { "cart_id": 131, "sku_id": 4939047817461 }, { "cart_id": 131, "sku_id": 4939047817463 }, { "cart_id": 131, "sku_id": 4939047817466 } ] }, { "item_id": 729563966440, "seller_id": 2211628865398, "sku": [ { "cart_id": 132, "sku_id": 894758674833 }, { "cart_id": 132, "sku_id": 4939047387945 }, { "cart_id": 132, "sku_id": 1243567817466 } ] } ]
期望生成的对象结构
{ "2549116888": { "2549116888": false, "696136507565": { "696136507565": false, "4939047817461": false, "4939047817463": false, "4939047817466": false } }, "2211628865398": { "2211628865398": false, "729563966440": { "729563966440": false, "894758674833": false, "4939047387945": false, "1243567817466": false } } }
当前错误结果
{ "2549116888": { "2549116888": false, "696136507565": { "696136507565": false, "4939047817466": false } }, "2211628865398": { "2211628865398": false, "729563966440": { "729563966440": false, "1243567817466": false } } }
尝试的代码
let myNewObj = {} myObj?.map((value) =>{ value?.sku?.map((val,key) =>{ let skuObj = { ...skuObj, [val.sku_id]: false } myNewObj ={...myNewObj, [value.seller_id]:{ [value.seller_id]: false, [value.item_id]:{ [value.item_id]: false, [val.sku_id]: false, }, }, } }) })
问题原因
每次遍历SKU时,都通过对象展开重新创建卖家和商品层级的对象,直接覆盖了之前已添加的SKU项,导致只有最后一个SKU被保留。另外代码中定义的skuObj未被实际使用,无法实现SKU累加。
修正后的代码
const myNewObj = {}; myObj.forEach(item => { const sellerId = String(item.seller_id); const itemId = String(item.item_id); // 初始化卖家结构(不存在则创建) if (!myNewObj[sellerId]) { myNewObj[sellerId] = { [sellerId]: false, [itemId]: { [itemId]: false } }; } // 卖家已存在时,初始化商品结构(不存在则创建) else if (!myNewObj[sellerId][itemId]) { myNewObj[sellerId][itemId] = { [itemId]: false }; } // 遍历所有SKU并添加到商品对象 item.sku.forEach(sku => { const skuId = String(sku.sku_id); myNewObj[sellerId][itemId][skuId] = false; }); }); console.log(myNewObj);
代码说明
- 用
forEach替代map:仅需遍历修改对象,无需返回新数组 - 层级存在性检查:避免重复创建卖家/商品结构,同时防止覆盖已有数据
- 逐个添加SKU:遍历每个SKU并直接追加到对应商品对象中,保留所有SKU项
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

