2009-12-10 42 views
1

我已經有兩個js數組,例如:名稱和值(具有相同的長度),現在我想用特定格式構造一個json對象?例如:如何使用來自多個javascript數組的信息構造一個json對象

names = ["label1","label2","label3"]; 
values = [[[0,1],[1,9],[2,10]],[[0,89],[1,91],[2,1]],[[0,1],[1,9],[2,10]]]; 

我想有這種格式的JSON數組data_spec

[{ 
    label:"label1", 
    data:[[0,1],[1,9],[2,10]] 
    }, 
    { 
    label:"label2", 
    data:[[0,89],[1,91],[2,1]] 
    }, 
    { 
    label:"label3", 
    data:[[0,1],[1,9],[2,10]] 
    }] 

誰能告訴人們如何?非常感謝!

回答

2

只需使用一個循環(確保兩個數組有相同的長度)

result = []; 
for(var i=0, len=names.length; i < len; i++) { 
    result.push({label: names[i], data: values[i]}); 
} 
+0

@Chetan,請通過計算循環外部的** names.length **來優化您的for循環,我會給您+1 – 2009-12-10 00:24:29

+0

完成,但數組長度足夠昂貴以致打擾?我知道nodelist#的長度是。 – 2009-12-10 00:27:49

+0

我無法確定哪種代價更高,但優化本身可以減少對** names.length **的調用N,其中N是數組項的數量(這可能非常昂貴) – 2009-12-10 00:35:26

-2
var myArray = 
    [{ 
     "label": "label1", 
     "data" : 
     { 
      "0": "1", 
      "1": "9", 
      "2": "10" 
     } 
    }, 

    { 
     "label": "label2", 
     "data" : 
     { 
      "0": "89", 
      "1": "91", 
      "2": "1" 
     } 
    }, 

    { 
     "label": "label3", 
     "data" : 
     { 
      "0": "1", 
      "1": "9", 
      "2": "10" 
     } 
    }]; 

    alert(myArray[0].data[2]); 
+0

我很確定提問者正在尋找一個動態的實現/諷刺。另外,爲什麼將對象文字用於「數據」而不是數組? – 2009-12-10 01:14:08

5

對於有些品種和支票,

var data_spec = []; 
if (names.length != values.length) { 
    // panic, throw an exception, log an error or just return an empty array 
} else { 
    for (var i=0, name; name = names[i]; i++) { // assuming a non-sparse array 
     data_spec[i] = { 
      label : name, 
      data : values[i] 
     }; 
    } 
} 

也就是說,非-sparse並且不包含任何其他將評估爲false的任何其他內容。

如果你的框架的每個功能添加到陣列,你不關心性能,

var data_spec = []; 
names.each(function(name) { 
    data_spec.push({ label : name, data : values[names.indexOf(name)] }); 
}); 

如果你的框架是一個乾淨的像道場,並把它別的地方(當然是道場),

var data_spec = []; 
dojo.forEach(names, function(name) { 
    data_spec.push({ label : name, data : values[names.indexOf(name)] }); 
}); 

如果框架具有每個功能,在它們的預期位置返回與每個操作的結果相同長度的陣列,

var data_spec = arrayOfResultsEach(names, function(name) { 
    return { label : name, data : values[names.indexOf(name)] }; 
}); 

這些只是爲了舉例說明,的indexOf任意長度的內部循環是一個重大的代碼的氣味。

+1

大多數數組迭代器實現(原型,jQuery.each)也將'index'參數傳遞給迭代器函數。所以你不需要'indexOf'。 – 2009-12-11 20:34:54

相關問題