原数据
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&