在另一个对象中获取对象属性的值(描述)

时间:2018-07-25 22:14:46

标签: javascript arrays map-function

我必须排列可以通过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解决此问题?

1 个答案:

答案 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))
})