简体   繁体   English

Lodash深层过滤器和地图嵌套对象

[英]Lodash deep filter and map nested object

I have below object which I am currently looping through in number of different functions to get an item with name or setting a new value. 我下面有一个对象,该对象当前正在许多不同功能中循环显示,以获取具有名称的项目或设置新值。 Currently I am using lodash _.foreach and ._map to achieve both actions. 目前,我正在使用lodash _.foreach和._map来完成这两个动作。 I know lodash has function such as _.filter however I am unable to get it to work with the object that I have. 我知道lodash具有_.filter之类的功能,但是我无法使其与我拥有的对象一起使用。

let 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
              }
           ]
        }
     ]
  }  

  {
     "panels" : [
        {
          "title": "Panel 4"
          "items" : [
              {
                 "name": item7,
                 "value": 7
              }
              {
                 "name": item8,
                 "value": 8
              }
           ]
        }
     ]
  }    
]


 // Get item from the object with given name
 getItem: function(name) {
   let item = false;
   _.forEach(data, function (group) {
       _.forEach(group.panels, function (panel) {
           _.forEach(panel.items, function (item) {
               if (item.name == name) {
                   filterItem = item;
                   return false;
               }
            });
       });
   }); 
   return item ;
 },

 //Set item new value
 updateItemValue (name, value) {
    _.map(data, function(group) {
        _.map(group.panels, function(panel) {
            _.map(panel.items, function(item) {
                if( item.name === name ) {                      
                   item.value = value;                   
                }
            });
        });
    });
 }

Is there any other way I can achieve this in more efficient way ? 我还有其他方法可以更有效地实现这一目标吗?

You could use nested for...of loops with destructuring . 你可以使用嵌套for...of与循环拆解 If an item has the provided name , return the item. 如果item具有提供的name ,则返回该项目。 Apply the same approach to updateItemValue as well 也对updateItemValue应用相同的方法

 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:4}]}]},{panels:[{title:"Panel 3",items:[{name:"item5",value:5},{name:"item6",value:6}]}]}]; function getItem(name) { for (const { panels } of data) for (const { items } of panels) for (const o of items) if (o.name === name) return o return; // if no match is found } function updateItemValue(name, value) { for (const { panels } of data) for (const { items } of panels) for (const o of items) if (o.name === name) { o.value = value return; } } console.log(getItem('item1')) console.log(getItem('item2')) console.log(getItem('doesntexist')) updateItemValue('item3', 33) // update the value console.log(getItem('item3')) // gets the updated value 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM