如何从带有嵌套对象的对象中获得上述预期输出

时间:2019-12-17 10:18:10

标签: javascript json

我有这些对象的数据, 但无法获得预期的输出 我们需要遍历对象子对象,并按以下特定顺序打印名称值

预期输出:

 kiran
    vish
     lav
     mall

尝试的代码:

let data = {
  name: 'kiran',
  children: [{
    name: 'vish',
    children: [{
        name: 'lav',
        children: []
      },
      {
        name: 'mall',
        children: []
      }
    ]
  }]
}

/* kiran
    vish
     lav
     mall */

function indent(inputData) {

  function indentHandler(inpData, level, output) {
    if (!output) {
      let output = '';
    }
    if (inpData.children.length) {

      for (let i = 0; i < inpData.children.length; i++) {
        level = level + 1;
        console.log(addSpaces(level) + inpData.name + '\n');
        indentHandler(inpData.children[i], level);
      }

    } else {
      console.log(addSpaces(level) + inpData.name + '\n');
    }
    return output;
  }

  return indentHandler(inputData, 0, '');
}

function addSpaces(level) {
  let outp = '';
  for (let i = 0; i < level; i++) {
    outp = outp + ' ';
  }
  return outp;
}

indent(data)

https://jsbin.com/yanogok/edit?js,console

请纠正我的程序,因为我无法获得正确的输出

3 个答案:

答案 0 :(得分:2)

  1. 将您的父母console.log移出循环
  2. 请勿循环更改level,只需传递level + 1

let data = {
  name: 'kiran',
  children: [{
    name: 'vish',
    children: [{
        name: 'lav',
        children: []
      },
      {
        name: 'mall',
        children: []
      }
    ]
  }]
}

/* kiran
    vish
     lav
     mall */

function indent(inputData) {

  function indentHandler(inpData, level, output) {
    if (!output) {
      let output = '';
    }
    if (inpData.children.length) {
        console.log(addSpaces(level) + inpData.name + '\n');

      for (let i = 0; i < inpData.children.length; i++) {
        indentHandler(inpData.children[i], level + 1);
      }

    } else {
      console.log(addSpaces(level) + inpData.name + '\n');
    }
    return output;
  }

  return indentHandler(inputData, 0, '');
}

function addSpaces(level) {
  let outp = '';
  for (let i = 0; i < level; i++) {
    outp = outp + ' ';
  }
  return outp;
}

indent(data)

答案 1 :(得分:1)

function indent(data){
    output = '';
    return (function indentHandler(data, level){
        output += addSpaces(level) + data['name'] + '\n';
        if (data['children'].length === 0){
            return output;
        }
        level += 1;
        data['children'].forEach(function(child){
            return indentHandler(child, level);
        });
        return output;
    })(data, 0, '');
}

function addSpaces(level) {
  let outp = '';
  for (let i = 0; i < level; i++) {
    outp = outp + ' ';
  }
  return outp;
}

indent(data)

答案 2 :(得分:1)

let data = {
    name: 'kiran',
    children: [{
        name: 'Akash',
        children: [{
            name: 'Hamza',
            children: []
        },
            {
                name: 'David',
                children: []
            },
            {
                name: 'Sultan',
                children: [{
                    name: 'Babar',
                    children: []
                },
                    {
                        name: 'Noor',
                        children: []
                    }
                ]
            }
        ]
    },
        {
            name: 'Smith',
            children: []
        }
    ]
}

function indent(inputData) {
    function indentHandler(inpData, level, output) {
        if (!output) {
            let output = '';
        }
        if (inpData.children.length) {
            console.log(addSpaces(level) + inpData.name + '\t');

            for (let i = 0; i < inpData.children.length; i++) {
                indentHandler(inpData.children[i], level + 1);
            }

        } else {
            console.log(addSpaces(level) + inpData.name + '');
        }
        return output;
    }

    return indentHandler(inputData, 0, ' ');
}

function addSpaces(level) {
    let outp = '';
    for (let i = 0; i < level; i++) {
        outp = outp + '  ';
    }
    return outp;
}

indent(data);