在javascript中将列转换为行

时间:2013-08-13 20:15:12

标签: javascript arrays transpose

我已经读过这个Swap rows with columns (transposition) of a matrix in javascript但是,它对我不起作用(因为我还是stupi)。

有许多数组作为单独的列,如:

id [1, 2, 3]
caption [one, two, three]
title [One, Two, Three]

我想将列转换为行:

arr= [1, one, One]

...

一些代码

        var res = [];

        for(i in this.fields) {

            for(j in this.fields[i].value) {

                res[j][i] = this.fields[i].value[j];

            }

        }

它给我“TypeError:无法将undefined转换为object”

在php中,这种方法运行正常,但有人可能会指出我如何在js中执行此操作。提前谢谢。

更新简化

var arr = [];
arr[0] = [];

arr[6][0] = 5;
/*
Exception: can't convert undefined to object
@Scratchpad/1:4
 */

当我们扫描普通字符串时,我们使用0-0,0-1,0-2之类的索引进行迭代,直到再次以1-0开始时依次行结束,依此类推。但是在这里我需要0-0,1-0,2-0结束,再次1-0,1-1,1-1 ......

更新“this”。只需添加一些行:

                console.log(this.fields[i].value[j]);
                console.log('indexes: i='+i, 'j='+j);

你可以看到没有未定义的值

4
indexes: i=0 j=0
1
indexes: i=1 j=0
1
indexes: i=2 j=0
one
indexes: i=3 j=0
One
indexes: i=4 j=0

2 个答案:

答案 0 :(得分:1)

您的源代码中存在一些错误。我们不知道您的this.fields值是怎样的,但是为了您的代码段,请让它看起来像这样:

this.fields = [
    { value: [1, 2, 3] },
    { value: [4, 5, 6] },
    { value: [7, 8, 9] }
]

如果您的this.fields变量看起来像这样,那么您离解决方案的距离就不远了。您的错误消息显示TypeError: can't convert undefined to object,因此我猜测您的变量看起来不像描述。

当我们以类似于我的示例的形式转换您的数据时,您的代码片段中的解决方案并不是那么遥远。问题是res不知道,它的第二个维度应该由数组组成,因为你从未定义过它。我们可以通过添加if(i === 0) res[j] = [];来解决此问题。

因此,通过所描述的结构和我们的小修复,它应该可以工作:

    var res = [];

    for(i in this.fields) {

        for(j in this.fields[i].value) {

            if(i === 0) res[j] = [];
            res[j][i] = this.fields[i].value[j];

        }

    }

答案 1 :(得分:0)

确定一个错误在循环内部。在第一次迭代res[j]存在,但内部循环res[j][i]内部未定义,将引发错误。您可以通过检查元素是否已存在来修复它:

var res = [];

for(i in this.fields) {

    for(j in this.fields[i].value) {

        if( !res[j] ) { res[j] = []; }

        res[j][i] = this.fields[i].value[j];

    }

}