Lodash deep filter and map nested object

懵懂的女人 提交于 2019-12-11 16:04:29

问题


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. I know lodash has function such as _.filter however I am unable to get it to work with the object that I have.

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 ?


回答1:


You could use nested for...of loops with destructuring. If an item has the provided name, return the item. Apply the same approach to updateItemValue as well

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


来源:https://stackoverflow.com/questions/59085944/lodash-deep-filter-and-map-nested-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!