Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
659 views
in Technique[技术] by (71.8m points)

javascript - 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 ?(我还有其他方法可以更有效地实现这一目标吗?)   ask by user4676307 translate from so

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...