原数据
forEach方式
forEach的缺点:forEach中处理数据为异步处理,当需要给原数据添加一个不存在的键值对时发现没添加进去。
优点:不用在乎下标、数据循环更直观
let goods = await goodsModel.find().lean()
let obj = {}
let data = []
goods.forEach(item => {
// 每个id对应着每个详细信息
obj[item['_id']] = item
/*
'63f7008d6197b4404f9972f5': {
_id: new ObjectId("63f7008d6197b4404f9972f5"),
name: '男装',
pid: new ObjectId("63f700050c18a313c3b95df5"),
__v: 0,
laval: 2
}
*/
})
goods.forEach(item => {
if (!item['pid']) { // 判断当前有没有pid
data.push(item)
/*
这是所有一级分类
[
{
_id: new ObjectId("63f700050c18a313c3b95df4"),
name: '家电',
__v: 0,
laval: 1
},
{
_id: new ObjectId("63f700050c18a313c3b95df5"),
name: '服装',
__v: 0,
laval: 1
},
{
_id: new ObjectId("63f700050c18a313c3b95df6"),
name: '床上用品',
__v: 0,
laval: 1
},
{
_id: new ObjectId("63f700050c18a313c3b95df7"),
name: '办公',
__v: 0,
laval: 1
}
]
*/
} else {
if (!obj[item['pid']]['children']) {// 如果存在pid判断obj中pid对应的值,是否有children键
// 没有则默认为空数组
obj[item['pid']]['children'] = []
}
// 然后将item添加到children数组中
obj[item['pid']]['children'].push(item)
// 注意这里没有修改data为什么data中的数据会变呢?
// 因为对象的存储方式是一块内存,当前的data和obj中的数据公用的一份内存
// 缺点来了!
// 如果现在在循环中查找一个数据库并添加到obj中是添加不进去的
let user = await userModel.find()
obj['name'] = user[0].username
}
})
/*
"data": [
{
"_id": "63f700050c18a313c3b95df4",
"name": "家电",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f70050be8d9854f128cf53",
"name": "大家电",
"pid": "63f700050c18a313c3b95df4",
"__v": 0,
"laval": 2,
"children": [
{
"_id": "6405a4e820dcfa51931c3e47",
"name": "冰箱",
"pid": "63f70050be8d9854f128cf53",
"__v": 0,
"laval": 3
},
{
"_id": "6405a4e820dcfa51931c3e48",
"name": "抽油烟机",
"pid": "63f70050be8d9854f128cf53",
"__v": 0,
"laval": 3
},
{
"_id": "6405a4e820dcfa51931c3e49",
"name": "空调",
"pid": "63f70050be8d9854f128cf53",
"__v": 0,
"laval": 3
}
]
},
{
"_id": "63f70050be8d9854f128cf54",
"name": "小家电",
"pid": "63f700050c18a313c3b95df4",
"__v": 0,
"laval": 2
}
]
},
{
"_id": "63f700050c18a313c3b95df5",
"name": "服装",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f7008d6197b4404f9972f5",
"name": "男装",
"pid": "63f700050c18a313c3b95df5",
"__v": 0,
"laval": 2
},
{
"_id": "63f7008d6197b4404f9972f6",
"name": "女装",
"pid": "63f700050c18a313c3b95df5",
"__v": 0,
"laval": 2
}
]
},
{
"_id": "63f700050c18a313c3b95df6",
"name": "床上用品",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f700da49da1edeff0db671",
"name": "被子",
"pid": "63f700050c18a313c3b95df6",
"__v": 0,
"laval": 2
},
{
"_id": "63f700da49da1edeff0db672",
"name": "枕头",
"pid": "63f700050c18a313c3b95df6",
"__v": 0,
"laval": 2
}
]
},
{
"_id": "63f700050c18a313c3b95df7",
"name": "办公",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f700f399767ce4ebfbeebb",
"name": "手机",
"pid": "63f700050c18a313c3b95df7",
"__v": 0,
"laval": 2
},
{
"_id": "63f700f399767ce4ebfbeebc",
"name": "电脑",
"pid": "63f700050c18a313c3b95df7",
"__v": 0,
"laval": 2
}
]
}
]
*/
for循环方法
建议使用for(let i = 0;i < length;i++){}
和forEach差别在下标
let goods = await goodsModel.find().lean()
let obj = {}
let data = []
goods.forEach(item => {
obj[item['_id']] = item
})
for (let i = 0; i < goods.length; i++) {
if (!goods[i]['pid']) {
data.push(goods[i])
} else {
if (!obj[goods[i]['pid']]['children']) {
obj[goods[i]['pid']]['children'] = []
}
obj[goods[i]['pid']]['children'].push(goods[i])
// 此时username字段加入到了obj中
let user = await userModel.find()
obj[goods[i]['_id']]['username'] = user[0].username
/*
"data": [
{
"_id": "63f700050c18a313c3b95df4",
"name": "家电",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f70050be8d9854f128cf53",
"name": "大家电",
"pid": "63f700050c18a313c3b95df4",
"__v": 0,
"laval": 2,
"username": "张三",
"children": [
{
"_id": "6405a4e820dcfa51931c3e47",
"name": "冰箱",
"pid": "63f70050be8d9854f128cf53",
"__v": 0,
"laval": 3,
"username": "张三"
},
{
"_id": "6405a4e820dcfa51931c3e48",
"name": "抽油烟机",
"pid": "63f70050be8d9854f128cf53",
"__v": 0,
"laval": 3,
"username": "张三"
},
{
"_id": "6405a4e820dcfa51931c3e49",
"name": "空调",
"pid": "63f70050be8d9854f128cf53",
"__v": 0,
"laval": 3,
"username": "张三"
}
]
},
{
"_id": "63f70050be8d9854f128cf54",
"name": "小家电",
"pid": "63f700050c18a313c3b95df4",
"__v": 0,
"laval": 2,
"username": "张三"
}
]
},
{
"_id": "63f700050c18a313c3b95df5",
"name": "服装",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f7008d6197b4404f9972f5",
"name": "男装",
"pid": "63f700050c18a313c3b95df5",
"__v": 0,
"laval": 2,
"username": "张三"
},
{
"_id": "63f7008d6197b4404f9972f6",
"name": "女装",
"pid": "63f700050c18a313c3b95df5",
"__v": 0,
"laval": 2,
"username": "张三"
}
]
},
{
"_id": "63f700050c18a313c3b95df6",
"name": "床上用品",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f700da49da1edeff0db671",
"name": "被子",
"pid": "63f700050c18a313c3b95df6",
"__v": 0,
"laval": 2,
"username": "张三"
},
{
"_id": "63f700da49da1edeff0db672",
"name": "枕头",
"pid": "63f700050c18a313c3b95df6",
"__v": 0,
"laval": 2,
"username": "张三"
}
]
},
{
"_id": "63f700050c18a313c3b95df7",
"name": "办公",
"__v": 0,
"laval": 1,
"children": [
{
"_id": "63f700f399767ce4ebfbeebb",
"name": "手机",
"pid": "63f700050c18a313c3b95df7",
"__v": 0,
"laval": 2,
"username": "张三"
},
{
"_id": "63f700f399767ce4ebfbeebc",
"name": "电脑",
"pid": "63f700050c18a313c3b95df7",
"__v": 0,
"laval": 2,
"username": "张三"
}
]
}
]
*/
}
}