2014-10-02 25 views
0

我試圖在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; 

     } 

    } 

功能需要保存從更深層次的遞歸返回鍵,以便它可以將其串連到的路徑。

也許我的算法可以改進,或者我在想它是錯的。任何人都可以給一些建議嗎謝謝!

回答

0

只是不要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分配之前(以便您基本上使用上一次迭代的值)。在條件之前移動屬性訪問!

  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; 
}