2015-01-12 19 views
0

所有節點和屈服鍵和值給定的JSON結構導線在Javascript

var json = { 
    'a': { 
    'a1': ['a1a', 'a1b', 'a1c'], 
    'a2': ['a2a', 'a2b'], 
    'a3': [] 
    }, 
    'b': { 
    'b1': ['b1a', 'b1b', 'b1c', 'b1d'], 
    'b2': ['b2a', 'b2b'], 
    }, 
    'c': ['c1', 'c2'], 
    'd': { 
    'd1': ['d1a', 'd1b', 'd1c'], 
    'd2': [] 
    }, 
    'e': ['e1', 'e2'], 
    'f': [ 
    'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10' 
    ] 
}; 

使用JavaScript如何可以遍歷這收率所有鍵和值的陣列?換句話說,在我遍歷的時候,如果不簡單地保留一個外部存儲並追加它,我怎樣才能返回整組節點鍵和值的數組?

例如在Python中,我可能會使用一個生成器。所以也許我應該問一下,我如何在JavaScript中使用一個生成器?

JavaScript示例使用jQuery:

function traverse(jsonObj) { 
    if(typeof jsonObj == "object") { 
    $.each(jsonObj, function(k,v) { 
     traverse(v); 
    }); 
    } 
    else { 
    // how can I yield this value instead? 
    console.log(jsonObj) 
    } 
} 

凡我預期輸出將是所有的鍵和值的數組:

['a', 'a1', 'a1a', 'a1b', 'a1c', 'a2', 'a2a', 'a2b'] // ... and so on 
+0

什麼是預期的輸出? – thefourtheye

+0

現在就添加它。 – yekta

回答

3

的ECMAScript 6具有generators。所以,你可以寫功能

function *traverse(value) { 
    if (typeof value === "object") { 
    var isArray = Array.isArray(value); 
    for (var prop in value) { 
     if (!isArray) yield prop; 
     yield* traverse(value[prop]); 
    } 
    } 
    else { 
    yield value; 
    } 
} 

而且使用它作爲:

var obj = { 
    'a': { 
    'a1': ['a1a', 'a1b', 'a1c'], 
    'a2': ['a2a', 'a2b'], 
    'a3': [] 
    } 
}; 

console.log(Array.from(traverse(obj))); 

DEMO via 6to5


但它也沒有太大的不同,而不本地發電機:

function traverse(value, result) { 
    result = result || []; 
    if (typeof value === "object") { 
    var isArray = Array.isArray(value); 
    for (var prop in value) { 
     if (!isArray) result.push(prop); 
     traverse(value[prop], result); 
    } 
    } 
    else { 
    result.push(value); 
    } 
    return result; 
} 

console.log(traverse(obj)); 
0

標準JavaScript圖案是在一個處理函數來傳遞:

function traverse(jsonObj, receive) { 
    if (typeof jsonObj == "object") { 
     if (Array.isArray(jsonObj)) { 
      // Don't want to output the keys for arrays 
      $.each(jsonObj, function (k, v) { 
       traverse(v, receive); 
      }); 

     } else { 
      $.each(jsonObj, function (k, v) { 
       traverse(k, receive); 
       traverse(v, receive); 
      }); 
     } 
    } else { 
     receive(jsonObj); 
    } 
} 

然後這是一些示例代碼,它選擇添加每個產生的ob ject到一個數組。

var myArray = []; 
traverse(myObject, function(jsonObj) { 
         myArray.push(jsonObj); 
       }); 

這裏的一個工作示例,其中,代替推到一個數組,在HTML顯示每個文件:http://jsfiddle.net/9u3zrjes/1/