开发者

Reorganize array of arrays to array of hashes and convert to JSON

I have the following array

开发者_C百科var arr=[[10,20,30],[12,21,33],[13,23,35]];

How can I convert that array to JSON. Desired result

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

I'm guessing I will have to define sting array

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

and do loop over these two values with the eval() function. Any help is greatly appreciated.


if you use 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/

if you use prototype:

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/


My version. Edit: I didn't twig objArray wasn't part of the problem, but the OP's suggestion as part of the solution. Oh well, I like it anyway.

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


Many different answers, here's another:

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


Assuming you just want to map the values to JavaScript objects:

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

If you really want to create a JSON string, then you can pass this array to JSON.stringify. JSON is available in all modern browser and can be loaded for older ones.


†: Why am I assuming here? Because people confuse JSON with JavaScript object literals. In your code, myJSONarr is not JSON. It is an array of JS objects. It would be JSON if the data would be contained in a string:

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

JSON != JavaScript object


What you are describing is not merely a JSON conversion. You actually have an array full of three element arrays of numbers, and what you are wanting is JSON for an array of hashes where each triplet becomes a hash over "x","y","z".

Anyway, if you want a simple .toJSON() function, Prototype.js includes a .toJSON() function onto most objects that makes it really easy.

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

Untested...

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();

Note that prototype also provides a function "zip" that can be used on line 2 instead of $H


Just loop through the array and create a string from each array inside it, then join the strings to form the JSON string:

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(',') + ']';


First:

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

Or, using higher-order functions:

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;
    }, {});
});

Then directly convert the new array to JSON.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜