2012-02-09 36 views
1

我想JQuery的數組,以重新安排JSON對象

 

    [ 
     "Data", 
      [ 
       "API", 
       "Apiales", 
       "Apiaceae", 
       "Apia", 
      ] 
     ] 

隱蔽這個JavaScript數組這種重排JSON格式

 

    [ 
    {"name":"API","id":"1"}, 
    {"name":"Apiales","id":"1"}, 
    {"name":"Apiaceae","id":"1"}, 
    {"name":"Apia","id":"1"} 
    ] 

感謝

更新: 我已經試過這

var aNewData =[]; 
      for(i in aData[1]){ 
      var item={}; 
      item.name = aData[1][i]; 
      item.id = "1"; 
      aNewData[i]=item; 
      } 
+0

而那些身份證是空空如也?或者他們只是從20開始數起來? – devnull69 2012-02-09 08:48:01

+0

身份證的只是作爲一個例子,以瞭解如何與第二個關鍵相關的想法:如果需要,配對值,謝謝 – 2012-02-09 09:14:11

回答

3

ID從哪裏來?測試下面的腳本,你的陣列是aData,結果將在aNewData

var aNewData = []; 
for (var i = 0; i < aData[1].length; i++) { 
    aNewData.push({ 
     "name": aData[1][i], 
     "id": 20 + i 
    }); 
} 

另見this example

+0

感謝scessor,它性能比我更新的解決方案更好嗎? – 2012-02-09 09:15:27

+0

不客氣。我們的解決方案之間應該沒有性能差異。 – scessor 2012-02-09 09:20:23

+1

@JaideepSingh使用'for ... in'在數組上迭代並不是一個好習慣。使用簡單的'for'作爲* scessor *做的。 [閱讀更多關於在SO上不使用'for ... in'的原因](http:// stackoverflow。COM /問題/ 500504/JavaScript的對合與陣列) – kapa 2012-02-09 09:20:56

0

你可以很容易地通過摺疊變換的數據:

var sourceData = ["API","Apiales","Apiaceae","Apia"]; 
var transformed = sourceData.reduce(function(result, name, index) { 
    return result.concat({ 
    name: name, 
    id: 20 + index 
    }); 
}, []); 

這會給你基本上是相同的,因爲對於scessor的循環,但在多個數據中心的方式。

認爲它是這樣的:

  1. 你把你的源數據(數組與所有這些「API *」的字符串)

  2. 您創建一個新的結果數組[](如第二傳遞參數爲reduce),應將其作爲下一個結果返回。

  3. 傳遞一個匿名函數來reduce將與3個參數來調用,每次的叫法,即result,這是您最近創建陣列,name每個那些「API *」的價值字符串,index ,它是原始數組內的那些字符串的索引。

  4. 您可以連續查看每個「api *」字符串,並將包含所需數據的新對象放入其中。由於result.concat將返回整個陣列,您只需添加那些

  5. 將返回包含所有數據的result數組。

但是爲了以防萬一你想成爲向下兼容舊瀏覽器兼容,我建議使用underscore.js了點。

+0

謝謝,學到了很多東西從答案 – 2012-02-10 10:52:04

+0

這就是我所希望的。很高興你可以利用它;) – Tharabas 2012-02-10 13:53:52