Javascript 如何使用递归json对象进行查询选择?
我在建一个网络垃圾箱。我有一个json选择器对象,我需要遍历它,这样我就可以获取页面上的每个值并捕获数据 如何创建一个lodash函数,递归遍历每个属性并执行一个标准函数,以基于选择器获取元素内部文本值Javascript 如何使用递归json对象进行查询选择?,javascript,arrays,lodash,Javascript,Arrays,Lodash,我在建一个网络垃圾箱。我有一个json选择器对象,我需要遍历它,这样我就可以获取页面上的每个值并捕获数据 如何创建一个lodash函数,递归遍历每个属性并执行一个标准函数,以基于选择器获取元素内部文本值 let startingJson = { address:"tbody > tr > td:nth-of-type(4) > p", comps: [{ address: "tbody > tr:nth-of-type(1) > t
let startingJson = {
address:"tbody > tr > td:nth-of-type(4) > p",
comps: [{
address: "tbody > tr:nth-of-type(1) > td:nth-of-type(1) > p",
link: "tbody > tr:nth-of-type(1) > td:nth-of-type(1) > p > a",
dateLastSold: "tbody > tr:nth-of-type(1) > td:nth-of-type(2) > p",
value: "tbody > tr:nth-of-type(1) > td:nth-of-type(3) > p"
},
{
address: "tbody > tr:nth-of-type(2) > td:nth-of-type(1) > p",
link: "tbody > tr:nth-of-type(2) > td:nth-of-type(1) > p > a",
dateLastSold: "tbody > tr:nth-of-type(2) > td:nth-of-type(2) > p",
value: "tbody > tr:nth-of-type(2) > td:nth-of-type(3) > p"
}]
}
let finalJsonExample = {
address:"123 Main Street",
comps: [{
address: "234 Main Street",
link: "abc.com",
dateLastSold: "10/20/19",
value: "100000"
},
{
address: "345 Main Street",
link: "def.com",
dateLastSold: "10/21/19",
value: "110000"
}]
}
您只需使用选择器递归地导航该对象,同时在到达其中一个叶子时从页面抓取元素,因为这些叶子属于
字符串类型
为此,您可以使用,以及:
const startingJson={
地址:“tbody>tr>td:n类型(4)>p”,
酒吧:“#baz”,
薪酬:[{
地址:“tbody>tr:N类型(1)>td:N类型(1)>p”,
链接:“tbody>tr:n类型(1)>td:n类型(1)>p>a”,
DateLastSelled:“tbody>tr:N类型(1)>td:N类型(2)>p”,
值:“tbody>tr:n类型(1)>td:n类型(3)>p”,
qux:“#qux”,
}, {
地址:“tbody>tr:n类型(2)>td:n类型(1)>p”,
链接:“tbody>tr:n类型(2)>td:n类型(1)>p>a”,
DateLastSelled:“tbody>tr:n类型(2)>td:n类型(2)>p”,
值:“tbody>tr:n类型(2)>td:n类型(3)>p”
}],
名单:[
"富平",,
"巴跨",,
],
};
函数getElements(选择器){
如果(选择器的类型=='string'){
//如果'selectors'是一个字符串,那么我们可以使用它来获取
//元素。您可能希望使用document.queryselectoral
//相反,如果返回了多个元素,则
//适当地:
const元素=document.querySelector(选择器);
//从该元素中提取“textContent”(如果有):
返回元素?(element.textContent | |“”):null;
}
if(Array.isArray(选择器)){
//如果向我们传递了一个数组,我们需要递归地搜索所有子对象
//填充与我们要返回的数组大小相同的数组时:
返回selectors.map(selector=>getElements(selector));
}
如果(选择器的类型===‘对象’){
//最后,如果传递给我们一个对象,我们需要探索它的所有条目
//并返回一个具有相同键但具有使用
//递归地使用相同的函数:
返回Object.entries(选择器).reduce((元素,[key,value])=>{
元素[键]=获取元素(值);
返回元素;
}, {});
}
返回null;
}
log(getElements(startingJson))代码>
。作为控制台包装器{
最大高度:100%!重要;
}
Foo
酒吧
巴兹
Qux
您可以使用lodash的..transform()
创建一个通用遍历函数,该函数同时处理对象和数组。在对象上调用traverse时,传递函数(fn
)以处理非对象值
在这种情况下,可以对值使用Document.querySelector()
,然后从节点提取文本内容
const recursiveTransform=(fn,val)=>u.transform(val,(acc,v,key)=>{
acc[key]=u.isObject(v)?递归变换(fn,v):fn(v);
});
const startingJson={“地址”:“tbody>tr>td:n类型(4)>p”,“酒吧”:“baz”,“comps”:[{“地址”:“tbody>tr:n类型(1)>td:n类型(1)>p”,“链接”:“tbody>tr:n类型(1)>td:n类型(1)>p>a”,“DateLastSelled”:“tbody>tr:n类型(1)>td:n类型(2)>p”,“值”:“tbody>tr:n类型(1)>n类型(1)>3)>:“#qux”},{“地址”:“tbody>tr:n类型(2)>td:n类型(1)>p”,“链接”:“tbody>tr:n类型(2)>td:n类型(1)>p>a”,“DateLastSelled:“tbody>tr:n类型(2)>td:n类型(2)>p”,“值”:“tbody>tr:n类型(2)>td:n类型(3)>p”],“列表”:“.foop”,};
常量结果=递归转换(q=>{
const r=document.querySelector(q);
返回r&r.textContent;
},startingJson);
控制台日志(结果)代码>
。作为控制台包装器{
最大高度:100%!重要;
}
Foo
酒吧
巴兹
Qux
请向我们展示您的尝试。因此,这不是一个免费的代码编写服务。这里的目标是帮助您在自己的尝试无法正常工作时修复它们…而不是为您完成所有工作