遍历JSON树以递归地检索父级和子级

时间:2018-11-27 07:12:56

标签: javascript node.js recursion iteration

我有一个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

2 个答案:

答案 0 :(得分:1)

假设您的数据具有以下格式:

const data = {
  'parent': {
    'child1': 1,
    'child2': 2,
    'child3': {
      'child31': 31,
      'child32': 32
    },
    'child4': 4
  }
}

您有关于递归的正确想法,但是递归需要两个元素:

  1. 具有终止的基本情况,
  2. 递归(希望减少)值。

在这种情况下,基本情况(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; }