我有一个JSON文件,将从中检索所有密钥。我需要以亲子方式检索密钥。例如:
父母
---- Child1
---- Child2
---- Child3
-------- Child31
-------- Child32
---- Child4
这可以通过递归实现吗?为了遍历文件,我使用以下代码:
function runRecurse(objLevel) {
for (var innerKey in objLevel) {
if (objLevel[innerKey] !== null){
console.log(innerKey);
runRecurse(objLevel[innerKey]);
}
}
}
有没有办法获得特定格式的结果:
无父母-父母
父母-子女1
父母-小孩2
父母-小孩3
儿童3-儿童31
Child3-Child32
父母-子女4
答案 0 :(得分:1)
假设您的数据具有以下格式:
const data = {
'parent': {
'child1': 1,
'child2': 2,
'child3': {
'child31': 31,
'child32': 32
},
'child4': 4
}
}
您有关于递归的正确想法,但是递归需要两个元素:
在这种情况下,基本情况(1.)没有子级,因此我们编写了此函数,如果元素没有子级,它将返回true
。您可能需要为数组更改它。
function isEmpty(obj) {
let numProperties = 0;
for (let property in obj) {
if (obj.hasOwnProperty(property)) {
++numProperties;
}
}
return numProperties === 0;
}
有了一个基本案例和一些数据,让我们对其进行递归。您想对每个父项(键)及其子项(元素)应用一个函数,然后在每个子项(2.)上调用它,因此我们为无序树编写了一个映射函数:
function mapParentChildPairs(f, obj) {
// If this element has no children, we have reached the end, so stop
if (isEmpty(obj)) {
return;
} else {
// Otherwise, get each key in the object
for (let item in obj) {
if (obj.hasOwnProperty(item)) {
// Apply the function to the key and its value
f(item, obj[item]);
// And recurse over the item at that key, which may be more objects
// or simply an atomic value that will end the recursion.
mapParentChildPairs(f, obj[item]);
}
}
}
}
您的示例使用了console.log
,因此让我们将其作为函数传递进来:
mapParentChildPairs(console.log, data);
答案 1 :(得分:1)
要获取所有键为单个路径,可以获取对象的条目并通过检查值是否也为对象进行迭代,然后使用子键或仅获取结果的实际键。
function getKeys(object) {
return Object
.entries(object)
.reduce((r, [k, v]) =>
r.concat(v && typeof v === 'object'
? getKeys(v).map(sub => [k].concat(sub))
: k
),
[]
);
}
var data = { v1: { Cr: { getrt: { input: { R: { Cd: "nt", Ud: "ing", Pd: "g", Mr: "ng", Se: "ng", Pe: "ing", Psion: "g", Rt: "L", Cd2: "xsring", Cag: "xsngth", NnfigID: "xsng", CryFlag1: "xength", C2: "xength", Custo3: "xength", Cus4: "xngth", tars: "ns", taace: "h.0" }, Reqails: { Amber: "xsd:string", B: "x", KenMI: "xg", targas: "ns", targace: "h" }, Inqutails: { "Inqnt[]": { Ar: "x", B: "x", KI: "x", ts: "ns", tce: "h0" }, tas: "ns", tace: "h" }, Reqdy: { Ise: "Inq", Tnt: "x", Ald: "x", Fme: "x", Fmjke: "xtern", Mme: "xttern", Lame: "xs", Fals: { "Ado[]": { Addme: "x", Adde: "AdnalNam", taas: "", taace: "ht" }, Noents: "x", talias: "n", tapace: "h" }, Ad1: "xh", A2: "x", Ae1: "xs", St: "x", L1: "xs", L2: "xs", Cy: "x", Ste: "S", Pal: "x", Is: { "I[]": { Aine: "x", Set: "xth", L1: "x", L2: "x", C: "x", Se: "St", Pal: "n", Ape: "", tas: "ns", tpace: "" } } } } } } } },
result = getKeys(data);
console.log(result.map(a => a.join(' ')));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
最后一个父节点和最后一个节点
function getKeys(object, parent = 'noParent') {
return object && typeof object === 'object'
? Object
.entries(object)
.reduce((r, [k, v]) => [...r, [parent, k], ...getKeys(v, k)], [])
: [];
}
var data = { v1: { Cr: { getrt: { input: { R: { Cd: "nt", Ud: "ing", Pd: "g", Mr: "ng", Se: "ng", Pe: "ing", Psion: "g", Rt: "L", Cd2: "xsring", Cag: "xsngth", NnfigID: "xsng", CryFlag1: "xength", C2: "xength", Custo3: "xength", Cus4: "xngth", tars: "ns", taace: "h.0" }, Reqails: { Amber: "xsd:string", B: "x", KenMI: "xg", targas: "ns", targace: "h" }, Inqutails: { "Inqnt[]": { Ar: "x", B: "x", KI: "x", ts: "ns", tce: "h0" }, tas: "ns", tace: "h" }, Reqdy: { Ise: "Inq", Tnt: "x", Ald: "x", Fme: "x", Fmjke: "xtern", Mme: "xttern", Lame: "xs", Fals: { "Ado[]": { Addme: "x", Adde: "AdnalNam", taas: "", taace: "ht" }, Noents: "x", talias: "n", tapace: "h" }, Ad1: "xh", A2: "x", Ae1: "xs", St: "x", L1: "xs", L2: "xs", Cy: "x", Ste: "S", Pal: "x", Is: { "I[]": { Aine: "x", Set: "xth", L1: "x", L2: "x", C: "x", Se: "St", Pal: "n", Ape: "", tas: "ns", tpace: "" } } } } } } } },
result = getKeys(data);
console.log(result.map(a => a.join(' ')));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }