【问题标题】:Combine objects of an array's subcategories based on its category根据类别组合数组子类别的对象
【发布时间】:2019-02-01 07:57:07
【问题描述】:

问:这是一个包含多个对象(类别和子类别)的数组。

let cats = [
  { cat: 'letter', subCat: 'A'}, 
  { cat: 'letter', subCat: 'B'}, 
  { cat: 'number', subCat: '2'}, 
  { cat: 'number', subCat: '3'}, 
  { cat: 'number', subCat: '4'}, 
  { cat: 'other', subCat: '+'}, 
]

需要像这样转换这个猫对象 -

cats = [
    { cat: 'letter', subCat: ['A', 'B'] },
    { cat: 'number', subCat: ['2', '3', '4'] },
    { cat: 'other', subCat: ['+'] }
  ]

【问题讨论】:

  • 嘿,我认为你在预期的 o/p 中犯了一个愚蠢的错误!不会是这样:cats = [ { cat: 'letter', subCat: ['A', 'B'] }, { cat: 'number', subCat: ['2', '3', '4' ] }, { cat: 'other', subCat: ['+'] } ]
  • 实际上我在过去 3 个小时里一直在尝试这个问题,不知道如何真正提出这个嵌套问题,所以我只写了问题和预期结果。

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

您可以使用简单的reduce 实现此目的

let cats=[{cat:'letter',subCat:'A'},{cat:'letter',subCat:'B'},{cat:'number',subCat:'2'},{cat:'number',subCat:'3'},{cat:'number',subCat:'4'},{cat:'other',subCat:'+'},]

const merged = cats.reduce((a, {cat, subCat})=>{
  a[cat] = a[cat] || {cat, subCat:[]}
  a[cat]["subCat"].push(subCat)
  return a;
},{})

console.log(Object.values(merged))

创建一个累加器,每个唯一的catkey,最终数组中所需的对象为value,如下所示:

{
  "letter": {
    "cat": "letter",
    "subCat": [
      "A",
      "B"
    ]
  }
}

然后使用Object.values 仅获取数组中的值。

你可以一次完成所有的事情:

let cats = [{cat:'letter',subCat:'A'},{cat:'letter',subCat:'B'},{cat:'number',subCat:'2'},{cat:'number',subCat:'3'},{cat:'number',subCat:'4'},{cat:'other',subCat:'+'},]

const merged = Object.values(cats.reduce((a,{cat, subCat}) => (
  (a[cat] = a[cat] || {cat, subCat:[]})["subCat"].push(subCat), a
),{}))

console.log(merged)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多