【问题标题】: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"]

【问题讨论】:

    标签: javascript arrays loops multidimensional-array


    【解决方案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 的答案。
    猜你喜欢
    • 2016-02-18
    • 2018-02-19
    • 2020-03-26
    • 2021-11-23
    • 2021-07-20
    • 2021-11-21
    相关资源
    最近更新 更多