Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用lodash查找深度嵌套的JSON属性_Javascript_Arrays_Json_Object_Lodash - Fatal编程技术网

Javascript 使用lodash查找深度嵌套的JSON属性

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

我有一个JSON API响应,其结构如下

[
  {
    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,只需使用普通的javascript
forEach
数组函数,并使用
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);
  }
});