[英]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.