将二维数组转换为一维数组,交替其值
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 的答案。以上是关于将二维数组转换为一维数组,交替其值的主要内容,如果未能解决你的问题,请参考以下文章