Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.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 在深度嵌套的JSON中查找具有特定名称的所有键_Javascript_Arrays_Json - Fatal编程技术网

Javascript 在深度嵌套的JSON中查找具有特定名称的所有键

Javascript 在深度嵌套的JSON中查找具有特定名称的所有键,javascript,arrays,json,Javascript,Arrays,Json,概述: 我有一个巨大的JSON对象,它可以达到40层的深度。我需要找到所有完全是“视频渲染器”的键 问题: 由于它的复杂性,我无法追踪“videoRenderer”将在何处显示。因此,我不能只使用“videos.data.videoRenderer”。我尝试使用map循环它,但它似乎会影响性能 目标 最终目标是拥有一个类似于getKeys('videoRenderer')的函数,它将返回一个包含所有找到的“videoRenderer”的对象数组 像这样:[{“videoRenderer”:{“a

概述:

我有一个巨大的JSON对象,它可以达到40层的深度。我需要找到所有完全是“视频渲染器”的键

问题:

由于它的复杂性,我无法追踪“videoRenderer”将在何处显示。因此,我不能只使用
“videos.data.videoRenderer”
。我尝试使用
map
循环它,但它似乎会影响性能

目标

最终目标是拥有一个类似于
getKeys('videoRenderer')
的函数,它将返回一个包含所有
找到的“videoRenderer”
的对象数组

像这样:
[{“videoRenderer”:{“a”:1}},{“videoRenderer”:{“b”:2}}]

请为我指出一个实现这一目标的方向,我已经在这方面坚持了几天了


多谢各位

我可能会这样做:

function allNodes(obj, key, array) {
  array = array || [];
  if ('object' === typeof obj) {
    for (let k in obj) {
      if (k === key) {
        array.push(obj[k]);
      } else {
        allNodes(obj[k], key, array);
      }
    }
  }
  return array;
}

results = allNodes(data, 'videoRenderer');

for(让k在obj中)的
将迭代对象属性和数组索引,两者都将显示为type
object
。然后递归地要求它将匹配的属性推送到结果数组中。该示例假设您的深度嵌套JSON对象名为
data

,尽管控制台在堆栈溢出时速度较慢,但我还是做到了这一点:

//{
get=(url、成功、上下文)=>{
const x=新的XMLHttpRequest;
常数c=上下文| | x;
x、 打开('GET',url);
x、 onload=()=>{
if(success)success.call(c,JSON.parse(x.responseText));
}
x、 send();
}
post=函数(url、发送、成功、上下文){
const x=新的XMLHttpRequest;
常数c=上下文| | x;
x、 打开('POST',url);
x、 onload=()=>{
if(success)success.call(c,JSON.parse(x.responseText));
}
if(typeof send=='object'&&send&!(数组的发送实例)){
if(发送FormData的实例){
x、 发送(send);
}
否则{
const fd=新表单数据;
for(让k输入发送){
append(k,JSON.stringify(send[k]);
}
x、 发送(fd);
}
}
否则{
抛出新错误(“发送参数必须是对象”);
}
返回x;
}
doc=document;html=doc.documentElement;bod=doc.body;nav=navigator;M=tag=>doc.createElement(tag);I=id=>doc.getElementById(id);
mobile=nav.userAgent.match(/Mobi/i)?真:假;
S=(选择器,在范围内)=>{
var w=在| | doc内;
返回w.querySelector(选择器);
}
Q=(选择器,内部)=>{
var w=在| | doc内;
返回w.querySelectorAll(选择器);
}
aC=函数(){
常量a=[].slice.call(参数),n=a.shift();
n、 添加(…a);
返回aC;
}
rC=函数(){
常量a=[].slice.call(参数),n=a.shift();
n、 类列表。删除(…a);
返回rC;
}
tC=函数(){
常量a=[].slice.call(参数),n=a.shift();
n、 切换(…a);
返回tC;
}
dig=功能(obj,func){
让v;
if(阵列的obj实例){

对于(让i=0,l=obj.length;i您希望输出是什么?用深度嵌套的JSON“find”是什么组成的?递归函数输出应该是一个对象数组。我将更新这个问题!所需的输出不是有效的JS。很抱歉,这不是真的,这是一个输入错误。下面是我想要的输出:
[{“videoRenderer”:{“a”:1},{“视频渲染器”:{“b”:2}}]