【问题标题】:Using recursion to return a value for each item in an array使用递归为数组中的每个项目返回一个值
【发布时间】:2014-11-27 06:28:08
【问题描述】:

我正在尝试在 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;

      }

  }

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

也许我的算法可以以某种方式改进,或者我想错了。谁能给点建议?谢谢!

【问题讨论】:

    标签: javascript arrays for-loop recursion


    【解决方案1】:

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

    还有一些其他的错误:

    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 之前,您正在测试它的类型(因此您基本上使用上一次迭代中的值)。将属性访问移到条件之前!

    3. 方法调用

      returnArray = returnArray.concat(…)
      

      没有做你认为它做的事。您正在传递一个要附加到数组的元组(数组),但concat method 合并了两个数组:[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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2021-07-21
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2013-08-07
      • 2022-01-02
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多