Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Lodash - Fatal编程技术网

Javascript 如何使用递归json对象进行查询选择?

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

我在建一个网络垃圾箱。我有一个json选择器对象,我需要遍历它,这样我就可以获取页面上的每个值并捕获数据

如何创建一个lodash函数,递归遍历每个属性并执行一个标准函数,以基于选择器获取元素内部文本值

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
请向我们展示您的尝试。因此,这不是一个免费的代码编写服务。这里的目标是帮助您在自己的尝试无法正常工作时修复它们…而不是为您完成所有工作