如何在对象中动态创建或修改子对象以实现杂货清单按货架分类?
嘿,这个需求其实很典型,我来帮你拆解实现思路,再给你具体的代码示例!
首先先纠正个小细节:你期望的结构里,货架对应的应该是数组而不是对象包裹数组(比如1: ['pizza', 'ice cream']而不是1: {['pizza', 'ice cream']}),这样更符合数组存列表的逻辑,也更易操作。
核心实现思路
其实就是「动态判断+属性赋值」的过程,分两步走:
- 先初始化一个包含空
aisles对象的基础结构,方便后续往里面添加货架和商品; - 遍历你的商品数据,对每个商品判断对应的货架是否已经存在:
- 如果不存在,就先给这个货架创建一个空数组;
- 如果已经存在,直接把商品添加到对应的数组里就行。
具体代码示例(以JavaScript为例)
假设你有一份带货架编号的商品列表,比如:
const groceryItems = [ { name: 'pizza', aisle: 1 }, { name: 'ice cream', aisle: 1 }, { name: 'tissues', aisle: 2 }, { name: 'toilet paper', aisle: 2 }, ];
然后用下面的代码就能生成你想要的结构:
// 初始化基础排序结构 const sortedGroceryList = { aisles: {} }; // 遍历所有商品,按货架分类 groceryItems.forEach(item => { const aisleId = item.aisle; // 检查当前货架是否已存在,不存在则初始化空数组 if (!sortedGroceryList.aisles[aisleId]) { sortedGroceryList.aisles[aisleId] = []; } // 将商品名称添加到对应货架的数组中 sortedGroceryList.aisles[aisleId].push(item.name); }); console.log(sortedGroceryList);
运行后你就能得到:
{ aisles: { 1: ['pizza', 'ice cream'], 2: ['tissues', 'toilet paper'] } }
一些扩展小技巧
- 如果你的货架编号是字符串(比如
'Aisle 1'),代码逻辑完全通用,不需要修改; - 如果要避免重复添加同一件商品,可以在push前加个判断:
if (!sortedGroceryList.aisles[aisleId].includes(item.name)) { ... }; - 如果有的商品没有货架编号,可以给个默认值(比如
aisle: 'Uncategorized'),或者直接跳过这类商品。
希望这个方案能帮到你,如果还有其他细节问题可以随时问!
内容的提问来源于stack exchange,提问作者Duncan Lutz
相关产品推荐
相关产品推荐

