将数组数组重组为哈希数组并转换为JSON

时间:2011-04-16 20:53:00

标签: javascript json

我有以下数组

var arr=[[10,20,30],[12,21,33],[13,23,35]];

如何将该数组转换为JSON。 期望的结果

myJSONarr=[ {"x":10 ,"y":20,"z":30}, {"x":12 ,"y":21,"z":33}, {"x":13, "y":23,"z":35} ];

我猜我必须定义sting数组

var objArray=["x","y","z"];

并使用eval()函数循环遍历这两个值。 非常感谢任何帮助。

7 个答案:

答案 0 :(得分:1)

如果你使用jquery:

var arr=[[10,20,30],[12,21,33],[13,23,35]],
myjson = JSON.stringify($.map(arr,function(a){return {x:a[0],y:a[1],z:a[2]}}));

http://jsfiddle.net/herostwist/yDRwh/

如果您使用原型:

var myjson  = JSON.stringify([[10,20,30],[12,21,33],[13,23,35]].map(function(a){
              return {x:a[0],y:a[1],z:a[2]}}));

http://jsfiddle.net/herostwist/yDRwh/1/

答案 1 :(得分:0)

假设您只想将值映射到JavaScript对象

var objs = [];

for(var i = 0, l = arr.length; i < l; i++) {
    var p = arr[i];
    objs.push({x: p[0], y: p[1], z: p[2]});
}

如果您确实要创建JSON字符串,则可以将此数组传递给JSON.stringify。所有现代浏览器and can be loaded for older ones都提供JSON


†:为什么我在这里假设?因为人们将JSON与JavaScript对象文字混淆。在您的代码中,myJSONarr 不是 JSON。它是一个JS对象数组。如果数据包含在字符串中,那将是JSON:

var myJSONarr = '[{"x":10, "y":20, "z":30}, ...]';

<强> JSON != JavaScript object

答案 2 :(得分:0)

我的版本。编辑:我没有twig objArray不是问题的一部分,但OP的建议作为解决方案的一部分。哦,不管怎样,我喜欢它。

var arr=[[10,20,30],[12,21,33],[13,23,35]];    
var objArray=["x","y","z"];

var myJSONarr = [];

for (var idx = 0; idx != arr.length; idx++) {
    var row = {};
    for (var idx2 = 0; idx2 != objArray.length; idx2++) {
       row[objArray[idx2]] = arr[idx][idx2];
    }
    myJSONarr.push(row);
}

alert(JSON.stringify(myJSONarr));

答案 3 :(得分:0)

首先:

var arr = [[10,20,30], [12,21,33], [13,23,35]];

var arr2 = [];
for (var i in arr) {
    var a = arr[i];
    arr2.push({
        x: a[0],
        y: a[1],  
        z: a[2]
    });
}

或者,使用高阶函数:

var labels = ["x", "y", "z"];
var arr = [[10,20,30], [12,21,33], [13,23,35]];
var arr2 = arr.map(function(a) {
    return a.reduce(function(prev, curr, i) {
        prev[labels[i]] = curr;
        return prev;
    }, {});
});

然后直接将新数组转换为JSON。

答案 4 :(得分:0)

许多不同的答案,这是另一个答案:

http://jsfiddle.net/Vecqc/

<textarea id="text" style="width: 100%;"></textarea>

var arr = [[10,20,30],[12,21,33],[13,23,35]];
var stringify = [];

for (var i = 0; i < arr.length; i++) {
    stringify[i] = {'x':arr[i][0],'y':arr[i][0],'z':arr[i][0]};
}

document.getElementById('text').value = JSON.stringify(stringify);

答案 5 :(得分:0)

您所描述的不仅仅是JSON转换。你实际上有一个包含三个数字元素数组的数组,你想要的是一个散列数组的JSON,其中每个三元组变成一个“x”,“y”,“z”的散列。

无论如何,如果你想要一个简单的.toJSON()函数,Prototype.js会在大多数对象上包含一个.toJSON()函数,这使得它非常简单。

http://www.prototypejs.org/learn/json

未经测试...

var arr=[[10,20,30],[12,21,33],[13,23,35]];
var myarrOfXYZ = arr.collect(function(T){ return $H({ x: T[0], y: T[1], z: T[2] }) });
var myJSON = myarrOfXYZ.toJSON();

请注意,prototype还提供了一个函数“zip”,可以在第2行而不是$ H

上使用

答案 6 :(得分:0)

只需遍历数组并从其中的每个数组创建一个字符串,然后连接字符串以形成JSON字符串:

var items = [];
for (var i = 0; i < arr.length; i++) {
  items.push('{"x":'+arr[i][0]+',"y":'+arr[i][1]+',"z":'+arr[i][2]+'}');
}
var myJSONarr = '[' + items.join(',') + ']';