javascript:如何将两个1D数组转换为2D数组

时间:2013-11-16 04:25:34

标签: javascript arrays

我必须准备在谷歌图表中使用的数据。我的意见是:

myHeader = ["header 1", "header 2"];
myCol1 = [1, 2, 3, 4, 5];
myCol2 = [100, 200, 300, 400, 500];

我需要的是:

myData = [["header1", "header2"],[1,100],[2, 200], [3, 300],[4, 400], [5, 500]];

我该如何转换它?我尝试使用push,但无法将[1,100]推送到包含["header1", "header2"]

的数组中

这是我之前尝试过的:

var myDATA = [new Array('header1', 'header2'), two1dto2d(myDate, myTemp)];

function two1dto2d(a,b) {
    var c = new Array;
    for (var i = 0; i < a.length; i++) {
        A = new Array(a[i],b[i]);
        console.log(A);
        c.push(A);
    }
    return c
};

但结果不符合我的预期:

enter image description here 有任何想法吗?

感谢

6 个答案:

答案 0 :(得分:1)

这个怎么样? http://jsfiddle.net/theoutlander/pXLLz/

myHeader = ["header 1", "header 2"];
myCol1 = [1, 2, 3, 4, 5];
myCol2 = [100, 200, 300, 400, 500];

mydata = [myHeader];

for(i=0; i<5; i++)
{
    mydata.push([myCol1[i],myCol2[i]]);
}

console.log(JSON.stringify(mydata));

答案 1 :(得分:1)

你得到的是一个三维数组,因为你将列对放入一个数组,然后你将它放在最后的数组中。

您需要将列对推入最外面的数组。例如:

var myDATA = [new Array('header1', 'header2')];
two1dto2d(myDATA, myDate, myTemp);

function two1dto2d(c, a, b) {
  for (var i = 0; i < a.length; i++) {
    c.push([a[i], b[i]]);
  }
}

答案 2 :(得分:0)

这应该有效

var output=[myHeader];
for(i=0;i<myCol1.length;i++){
   output.push( [myCol1[i], myCol2[i] ]);
};

DEMO

答案 3 :(得分:0)

除了标题之外,您正在寻找通常称为zip的内容,如下划线所示http://underscorejs.org/#zip

myHeader = ["header 1", "header 2"];
myCol1 = [1, 2, 3, 4, 5];
myCol2 = [100, 200, 300, 400, 500];

// basic zip implementation
var zip = function (arr1, arr2) {
    var len = Math.max(arr1.length, arr2.length);
    var arr = new Array(len);
    for (var i = 0; i < len; i += 1) {
        arr[i] = [arr1[i], arr2[i]];
    }
    return arr; 
};
data = [myHeader].concat(zip(myCol1, myCol2));

答案 4 :(得分:0)

我提出的另一种方式,因为我之前在所有其他答案中都没有注意到[ ]

var foo = ['a', 'b', 'c', 'd'];
var bar = [1,2,3,4];
var ar2 = [];

for(var i in arr) {
    var ar3 = []
    ar3.push(foo[i], bar[i]);
    ar2.push(ar3);
}
console.log(ar2);

答案 5 :(得分:0)

该功能的一般版本:

Array.prototype.mergeWith = function(...args) {
    // PREPARATION
    let L = this.length, // memorize the length of `this` array
        n = 0, array, // iterators
        res = []; // the result will be here

    // CALCULATION
    for (; n < L; n++) // iterate over the length of `this`
        for (array of args) // iterate over `args`
            if (array instanceof Array && array.length === L) // if `array` is really an array and it is as lengthy as `this`, …
                res.push([this[n], array[n]]); // … push every n-th object of `array` to n-th array of `res`
            else return; // check whether all the operands are arrays of the same length
    return res; // eventually return result
}

同样的事情缩小了:

Array.prototype.mergeWith = function(...A) {
    let L = this.length, r = [], n = 0, a;
    for (; n < L; n++) for (a of A) if (a instanceof Array && a.length === L) r.push([this[n], a[n]]); else return;
    return r;
}

使用:

var arr1 = [1, 2, 3, 4],
    arr2 = ["a", "b", "c", "d"];

var A = arr1.mergeWith(arr2);
// [ [1, "a"],
//   [2, "b"],
//   [3, "c"],
//   [4, "d"] ]

var arr3 = [[31, 32], [33, 34], [35, 36], [37, 38]];

var B = arr1.mergeWith(arr2, arr3);
// [ [1, "a", [ 31, 32 ]],
//   [2, "b", [ 33, 34 ]],
//   [3, "c", [ 35, 36 ]],
//   [4, "d", [ 37, 38 ]] ]

在您的特定情况下使用:

myData = myCol1.mergeWith(myCol2);
myData.unshift(myHeader);
// [ ["header1", "header2"],
//   [1, 100],
//   [2, 200],
//   [3, 300],
//   [4, 400],
//   [5, 500]               ];