我必须排列可以通过CategoryId相互关联的对象数组。像下面的代码:
const Category = [
{ ID: 100 , Description: Cate1},
{ID: 101 , Description: Cate2}
]
const Items = [
{ID: 2001, CategoryID: 100, Desc: Item1 },
{ID: 2002, CategoryID: 100, Desc: Item2 },
{ID: 2003, CategoryID: 101, Desc: Item3 },
]
我将使用lis中的map方法来分发项目,这些方法根据从两个数组中都存在的类别ID中提取的类别描述在其自己的ul中进行了总结。例如:
Cate1 > ul
item1 > li
item2 > li
Cate2 > ul
item3 > li
。 。 。 如何使用Javascript或ES6 / 7/8解决此问题?
答案 0 :(得分:0)
您可以查看每个类别以及每个filter()
的匹配项。这很容易,但是如果您有很多数据,将会有点慢,因为每次都循环浏览项目列表:
const Category = [{ ID: 100 , Description: 'Cate1'}, {ID: 101 , Description: 'Cate2'}]
const Items = [ {ID: 2001, 'CategoryID': 100, Desc: 'Item1' }, {ID: 2002, 'CategoryID': 100, Desc: 'Item2' }, {ID: 2003, 'CategoryID': 101, Desc: 'Item3' }, ]
Category.forEach(cat => {
console.log('ul> '+cat.Description)
Items.filter(item => item.CategoryID === cat.ID)
.forEach(item => console.log(' li> ' + item.Desc))
})
或者,您可以基于ID一次为商品建立一个查找表,然后用它在恒定时间内查找商品。使用更大的数据,这将更快,但是需要更多的前期工作:
const Category = [{ ID: 100 , Description: 'Cate1'}, {ID: 101 , Description: 'Cate2'}]
const Items = [ {ID: 2001, 'CategoryID': 100, Desc: 'Item1' }, {ID: 2002, 'CategoryID': 100, Desc: 'Item2' }, {ID: 2003, 'CategoryID': 101, Desc: 'Item3' }, ]
let lookup = Items.reduce((a, c) => {
(a[c.CategoryID] || (a[c.CategoryID] = [])).push(c)
return a
}, {})
Category.forEach(cat => {
console.log('ul> '+cat.Description)
lookup[cat.ID]
.forEach(item => console.log(' li> ' + item.Desc))
})