繁体   English   中英

使用递归为数组中的每个项目返回值

[英]Using recursion to return a value for each item in an array

我正在尝试在JavaScript中使用递归深入对象,并返回其键和值。

例如:

var json2 = {
  'key1': {
    'key2Nested': {
      'key3Nested': {
        'key4Nested': 'SomeValue'
      },
      'key5Nested': 'unimportantValue',
      'key6Nested': 'SimpleValue'
    },
    'key7Nested': '2SimpleValue',
    'key8Nested': 'unimportantValue2'
  }
};

该函数将接受上述输入并返回类似

['key1/key2Nested/key3Nested/key4Nested', 'SomeValue'],
['key1/key2Nested/key5Nested', 'unimportantValue'],

对于所有值,等等。 问题是我尝试在所有对象的键上使用for循环,并且尝试在循环内使用递归。 但是递归值返回一个数组,该数组结束for循环。

这是我到目前为止的代码:

var makeArray = function(obj) {
      var keysArray = Object.keys(obj);
      var returnArray = [];

      for (var i = 0; i < keysArray.length; i++) {
          var key = keysArray[i];
          var next_results;
          var path, value;

          if (typeof(value) != 'object' ) {
              value = obj[key];
              returnArray = orderedArray.concat([key, value]);
          } else if (typeof(value) == "object") {
              next_results = makeArray(obj[key]);
              if (next_results) { 
                  for (var j = 0; j < next_results.length; j++) {
                    next_results[j][1] = '/' + key + next_results[j][1];
                    returnArray = returnArray.concat(next_results[j]);
                  }
              }
          } 
          console.log(returnArray);
          return returnArray;

      }

  }

该函数需要保存从较深的递归级别返回的键,以便可以将其连接到路径。

也许可以以某种方式改进我的算法,或者我认为它是错误的。 任何人都可以提一些建议吗? 谢谢!

只是不要在for循环体内return returnArray ,而只能在它之后返回。

另外,还有一些其他错误:

  1. 线

     next_results[j][1] = '/' + key + next_results[j][1]; 

    似乎不正确。 您的键位于每个元组的第一个插槽中,并且您希望键之间的斜线不在它们之前:

     next_results[j][0] = key + '/' + next_results[j][0]; 
  2.  var path, value; if (typeof(value) != 'object' ) { value = obj[key]; 

    您要在分配value之前测试value的类型(以便基本上使用上一次迭代中的值)。 在条件出现之前移动属性访问权限!

  3. 方法调用

     returnArray = returnArray.concat(…) 

    不按照您的想法去做。 您传入了要附加到数组的元组(数组),但是concat方法合并了两个数组: [key1, value1].concat([key2, value]) == [key1, value1, key2, value2] 您想使用push来获取元组数组。

整体上:

function makeArray(obj) {
    var keys = Object.keys(obj);
    var returnArray = [];

    for (var i = 0; i < keys.length; i++) {
        var key = keys[i],
            value = obj[key];

        if (typeof value != 'object' ) {
            returnArray.push([key, value]);
        } else {
            var next_results = makeArray(value);
            for (var j = 0; j < next_results.length; j++) {
                next_results[j][0] = key + '/' + next_results[j][0];
                returnArray.push(next_results[j]);
            }
        }
    }
    return returnArray;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM