-1

我已经在 javascript 中阅读了此 Swap rows with columns (transposition) of a matrix但是,它对我不起作用(因为我仍然 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:无法将未定义转换为对象”

在 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 等等。但是在这里我需要 col 的 0-0、1-0、2-0 结尾和 1-0、1-1、1-1 ...

更新“这个”。只需添加几行:

                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
4

2 回答 2

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

        }

    }
于 2013-08-13T20:30:18.963 回答
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];

    }

}
于 2013-08-13T20:25:59.223 回答