Lodash 从嵌套对象中提取值

Lodash extract value from nested object

我有以下对象,我目前正在循环访问它以获取项目值。目前我正在使用 lodash _.forEach 来实现这一点。我不确定如何最好地创建一个以项目名称作为键并将值作为值的新对象。

data =  [
  {
     "panels" : [
        {
          "title": "Panel 1",
          "items" : [
              {
                 "name": item1,
                 "value": 1
              }
              {
                 "name": item2,
                 "value": 2
              }
           ]
         },
         {
            "title": "Panel 2",
             "items" : [
              {
                 "name": item3,
                 "value": 3
              }
              {
                 "name": item4,
                 "value": 5
              }
           ]
         }
     ]
  }

  {
     "panels" : [
        {
          "title": "Panel 3"
          "items" : [
              {
                 "name": item5,
                 "value": 5
              }
              {
                 "name": item6,
                 "value": 6
              }
           ]
        }
     ]
  }  
]

  let values = [];
    _.forEach(data, (groups) => {
        _.forEach(groups.panels, (panel) => {
            _.forEach(panel.items, (item) => {
                  values[item.name] = item.value;                   
            });
        });
    });
    return values;

有没有其他方法可以更有效地实现这一点?

您可以使用嵌套 for...of loops with destructuring

const data=[{panels:[{title:"Panel 1",items:[{name:"item1",value:1},{name:"item2",value:2}]},{title:"Panel 2",items:[{name:"item3",value:3},{name:"item4",value:5}]}]},{panels:[{title:"Panel 3",items:[{name:"item5",value:5},{name:"item6",value:6}]}]}];

const output = {};

for (const { panels } of data)
  for (const { items } of panels)
    for (const { name, value } of items)
      output[name] = value;

console.log(output)

或者,

您可以使用链式 flatMap 来获取项目数组。然后 reduce items 数组以 name 作为键和 value 作为值

得到一个对象

const data=[{panels:[{title:"Panel 1",items:[{name:"item1",value:1},{name:"item2",value:2}]},{title:"Panel 2",items:[{name:"item3",value:3},{name:"item4",value:5}]}]},{panels:[{title:"Panel 3",items:[{name:"item5",value:5},{name:"item6",value:6}]}]}];

const output = data.flatMap(o => o.panels)
                   .flatMap(p => p.items)
                   .reduce((acc, o) => ({ ...acc, [o.name]: o.value }), {})

console.log(output)