Javascript 使用lodash查找深度嵌套的JSON属性
我有一个JSON API响应,其结构如下Javascript 使用lodash查找深度嵌套的JSON属性,javascript,arrays,json,object,lodash,Javascript,Arrays,Json,Object,Lodash,我有一个JSON API响应,其结构如下 [ { title: "top1", sections: [ { section_title: "section1", content: [ { content_title: "title1", content_id: "id1" }, { content_ti
[
{
title: "top1",
sections: [
{
section_title: "section1",
content: [
{
content_title: "title1",
content_id: "id1"
},
{
content_title: "title2",
content_id: "id2"
}
]
},
{
section_title: "section2",
content: [
{
content_title: "title3",
content_id: "id3"
},
{
content_title: "title4",
content_id: "id4"
}
]
}
]
}, {
title: "top2",
sections: [...]
},
...
]
我还有一个小的内容ID数组arr2=['id2','id3']
。我需要从API请求中搜索数据,以查找arr2
中包含的任何内容id
我有一些有效的lodash代码,但我的嵌套forEach方法似乎不是最有效的方法:
_.forEach(response, function(top) {
_.forEach(top.sections, function(section) {
_.forEach(section.content, function(content) {
_.forEach(arr2, function(id) {
if(id === content.content_id) {
// Do stuff
}
})
})
})
})
我怎样才能改进这段代码呢?经过一番思考,我实际上无法为您提供使用其他lodash函数的更优雅的解决方案。似乎要为每种情况设置所拥有的属性,
forEach
。我唯一能做的优化就是避免使用lodash,只需使用普通的javascriptforEach
数组函数,并使用find
替换最里面的forEach(可能会稍微提高性能)
我个人也喜欢箭头函数语法 您可以创建一个递归迭代已识别子体属性的函数
function deepWalk(collection, childKeys, iteratee) {
// create a partial _.each with an iterator that will
// recursively traverse properties from the `childKeys` array
var each = _.partial(_.each, _, function(value, index) {
// invoke iteratee callback
iteratee(value, index);
// only recursively iterate over properties found in childKeys
_(value).pick(childKeys).each(each);
});
// invoke iteration
each(collection);
}
deepWalk(collection, ['sections', 'content'], function(value) {
if(_.includes(['id2', 'id3'], value.content_id)) {
// do whatever you want here..
console.log(value);
}
});
var集合=[
{
标题:“top1”,
章节:[
{
章节标题:“章节1”,
内容:[
{
内容标题:“标题1”,
content_id:“id1”
},
{
内容标题:“标题2”,
content_id:“id2”
}
]
},
{
章节标题:“章节2”,
内容:[
{
内容标题:“标题3”,
content_id:“id3”
},
{
内容标题:“标题4”,
content_id:“id4”
}
]
}
]
}
];
函数deepWalk(集合、子键、迭代对象){
//创建一个部分u0。每个部分都带有一个迭代器,该迭代器将
//递归遍历“childKeys”数组中的属性
var each=u.partial(u.each,u,函数(值,索引){
//调用迭代对象回调
迭代对象(值、索引);
//仅递归地迭代在childKeys中找到的属性
_(值)。拾取(子键)。每个(每个);
});
//调用迭代
每个(集合);
}
deepWalk(集合,['sections','content'],函数(值){
if(u.includes(['id2','id3'],value.content_id)){
//在这里你想干什么就干什么。。
console.log(值);
}
});代码>
.as控制台包装{最小高度:100%;顶部:0;}
我想举一个例子,说明一下//做你想做的事情。您希望以某种方式改变API响应,还是基于内容对象匹配创建新对象。如果您想对每个匹配对象执行某些操作,那么您的迭代就可以了,尽管u.find()可能有助于删除循环。如果比较结果为true,我将在找到的内容
对象上将属性设置为true,父对象部分对象上的属性为true,祖辈对象顶部对象上的属性为true:content.owned=true
,section.owned=true
,top.owned=true
function deepWalk(collection, childKeys, iteratee) {
// create a partial _.each with an iterator that will
// recursively traverse properties from the `childKeys` array
var each = _.partial(_.each, _, function(value, index) {
// invoke iteratee callback
iteratee(value, index);
// only recursively iterate over properties found in childKeys
_(value).pick(childKeys).each(each);
});
// invoke iteration
each(collection);
}
deepWalk(collection, ['sections', 'content'], function(value) {
if(_.includes(['id2', 'id3'], value.content_id)) {
// do whatever you want here..
console.log(value);
}
});