将二维数组转换为一维数组,交替其值

Posted

技术标签:

【中文标题】将二维数组转换为一维数组,交替其值【英文标题】:Convert a bidimensional array to a 1D array alternating their values 【发布时间】:2018-11-02 23:50:17 【问题描述】:

我有一个这样的二维数组:

let test2d = [
  ["foo", "bar"],
  ["baz", "biz"]
]

如果我想将此二维数组转换为一维数组(不改变它们的值),我可以通过两种方式实现:

第一种方式:

let merged = test2d.reduce( (prev, next) => prev.concat(next) )
console.log(merged) // ["foo", "bar", "baz", "biz"]

第二种方式:

let arr1d = [].concat.apply([], test2d)
console.log(arr1d) // ["foo", "bar", "baz", "biz"]

问题:我怎样才能得到一个一维数组,但它们的值是交替的?我的意思是这样的:

["foo", "baz", "bar", "biz"]

【问题讨论】:

【参考方案1】:

您可以使用此处定义的zip 函数:javascript equivalent of Python's zip function

let zip= rows => rows[0].map((_,c)=>rows.map(row=>row[c]))

所以你可以调用:

let arr1d = [].concat.apply([], zip(test2d))

这是完整的代码:

let test2d = [ ["foo", "bar"], ["baz", "biz"] ]

let zip = rows => rows[0].map((_, c) => rows.map(row => row[c]))

let arr1d = [].concat.apply([], zip(test2d))

console.log(arr1d)

【讨论】:

这个很优雅!谢谢你的回答。【参考方案2】:

您可以为每个索引获取一个数组,并在最后连接数组。

var array = [["foo", "bar"], ["baz", "biz"]],
    result = [].concat(...array.reduce((r, a) => 
        a.forEach((v, i) => (r[i] = r[i] || []).push(v));
        return r;
    , []));

console.log(result);

【讨论】:

嗨@NinaScholz,如果你不介意你能详细说明(r[i] = r[i] || []).push(v)吗?我一直遵循您的解决方案,直到那行代码丢失 你可以写两行代码:r[i] = r[i] || [];r[i].push(v)。第一行检查r[i] 是否为真,就像一个数组,如果不是,它将一个数组作为assingment。第二个将项目推送到此数组。【参考方案3】:

为什么不使用常规的 for 循环?这是高效且易于阅读的。

var arr1d = [];
for (let i = 0; i < test2d[0].length; i++) 
    for (let j = 0; j < test2d.length; j++) 
        arr1d.push(test2d[j][i]);
    

【讨论】:

这个解决方案也有效,即使有更多的行和列。谢谢!【参考方案4】:

这个解决方案很容易理解,它只是使用嵌套的 for 循环来获得所需的输出:

var data = [];  // This will be the new array
let test2d =    // This is your 2D array
[  
  ["foo", "bar"],
  ["baz", "biz"]
]

// Here we use nested for-loops to add the items to data[] in the desired order
for(var i = 0; i < test2d.length; i++) 
    for(var j = 0; j < test2d[0].length; j++) 
        data.push(test2d[j][i]);
    


console.log(data); // Print the output :)

data 数组现在等于:[ "foo", "baz", "bar", "biz" ]

希望这有帮助!

【讨论】:

感谢您的回答,但此解决方案仅适用于我的 test2d 数组,但如果我向数组中添加更多行和列,它就不起作用。为什么?因为诀窍是从列 (test2d[0].length) 而不是行 (test2d.length) 开始循环。查看 patstuart 的答案。

以上是关于将二维数组转换为一维数组,交替其值的主要内容,如果未能解决你的问题,请参考以下文章

C将一维数组转换为二维数组

js怎样将一维数组转换成二维数组

将二维坐标转换为一维数组

python将一维概率数组转换为二维数组

PHP将一维数组转换为二维数组

如何在Java中将二维布尔数组转换为一维字节数组?