【问题标题】:Lodash extract value from nested objectLodash 从嵌套对象中提取值
【发布时间】:2019-11-28 10:15:11
【问题描述】:

我有下面的对象,我目前正在循环获取项目值。目前我正在使用 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;

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

【问题讨论】:

    标签: javascript lodash extract


    【解决方案1】:

    您可以使用嵌套的 for...of 循环和 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)

    【讨论】:

    • 非常感谢,这是一个很好的解决方案。是否有任何改变,您可以帮助我解决与此相关的其他问题之一。 stackoverflow.com/questions/59085944/…。非常感谢您的帮助。
    • @user4676307 您可以使用链接的flatMap 获取项目,然后在项目数组上使用findconst found = data.flatMap(o => o.panels) .flatMap(p => p.items).find(o => o.name === 'name') 或者您可以使用答案中提到的for...of 循环,并在找到匹配项后立即使用return
    • 在链接的问题中添加了答案
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2022-11-13
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2018-07-31
    • 2022-01-07
    相关资源
    最近更新 更多