Javascript 在深度嵌套的JSON中查找具有特定名称的所有键
概述: 我有一个巨大的JSON对象,它可以达到40层的深度。我需要找到所有完全是“视频渲染器”的键 问题: 由于它的复杂性,我无法追踪“videoRenderer”将在何处显示。因此,我不能只使用Javascript 在深度嵌套的JSON中查找具有特定名称的所有键,javascript,arrays,json,Javascript,Arrays,Json,概述: 我有一个巨大的JSON对象,它可以达到40层的深度。我需要找到所有完全是“视频渲染器”的键 问题: 由于它的复杂性,我无法追踪“videoRenderer”将在何处显示。因此,我不能只使用“videos.data.videoRenderer”。我尝试使用map循环它,但它似乎会影响性能 目标 最终目标是拥有一个类似于getKeys('videoRenderer')的函数,它将返回一个包含所有找到的“videoRenderer”的对象数组 像这样:[{“videoRenderer”:{“a
“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中)的
将迭代对象属性和数组索引,两者都将显示为typeobject
。然后递归地要求它将匹配的属性推送到结果数组中。该示例假设您的深度嵌套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}}]