【问题标题】:Convert a 2D JavaScript array to a 1D array [duplicate]将二维 JavaScript 数组转换为一维数组 [重复]
【发布时间】:2013-01-27 06:30:51
【问题描述】:

我想将 2D JavaScript 数组转换为 1D 数组,以便将 2D 数组的每个元素连接成单个 1D 数组。

在这里,我正在尝试将arrToConvert 转换为一维数组。

var arrToConvert = [[0,0,1],[2,3,3],[4,4,5]];

console.log(get1DArray(arrToConvert)); //print the converted array

function get1DArray(2dArr){
    //concatenate each element of the input into a 1D array, and return the output
    //what would be the best way to implement this function?
}

【问题讨论】:

  • @MichaelBerkowski 看起来Array.join() 返回的是字符串而不是数组。
  • 您的预期输出是什么?您的意思是要将 3 个子阵列扁平化为一个阵列吗?我认为我误解了。
  • 是不是就这么简单arrToConvert.flat()

标签: javascript


【解决方案1】:
var arrToConvert = [[0,0,1],[2,3,3],[4,4,5]];

var modifiedArray = arrToConvert.map(function(array){ 
    return array[0]+array[1]+array[2];
});

另一个例子

var passengers = [ 
  ["Thomas", "Meeks"],
  ["Gregg", "Pollack"],
  ["Christine", "Wong"],
  ["Dan", "McGaw"]
];

var modifiedNames = passengers.map(function(convArray){
    return convArray[0]+" "+convArray[1];
});

【讨论】:

    【解决方案2】:

    使用 ES6 扩展运算符

    arr1d = [].concat(...arr2d);
    

    请注意,此方法仅在 arr2d 的子数组少于 100 000 个时才有效。如果你的数组比这个大,你会得到一个RangeError: too many function arguments

    对于 > ~100 000 行

    arr = [];
    for (row of table) for (e of row) arr.push(e);
    

    concat() 在这种情况下无论如何都太慢了。

    Underscore.js 方式

    这将递归地展平任何深度的数组(也应该适用于大型数组):

    arr1d = _.flatten(arr2d);
    

    如果您只想将其展平一层,请将true 作为第二个参数传递。

    一个简短的
    arr1d = [].concat.apply([], arr2d);
    

    【讨论】:

    • 当我尝试在简单的东西上使用它时,下划线方式给我一个错误,说它是 undefince
    • @daddycardona underscore.js 是一个外部库。在您导入它之前它将是未定义的。 underscorejs.org
    • 只是补充... ES2019 在 Array Prototype 中引入了 .flat() 方法。您可以在 flat() 方法中传递“深度”参数来指定嵌套数组结构应该被展平的深度。默认为 1。
    【解决方案3】:

    试试.reduce()

    var test2d = [
      ["foo", "bar"],
      ["baz", "biz"]
    ];
    var merged = test2d.reduce(function(prev, next) {
      return prev.concat(next);
    });
    

    来源http://jsperf.com/2-dimensional-array-merge

    【讨论】:

      【解决方案4】:
      var arrToConvert = [[0, 0, 1], [2, 3, 3], [4, 4, 5]];
      
      function get1DArray(arr){
      
          var result = new Array();
      
          for (var x = 0; x < arr.length; x++){
              for (var y = 0; y < arr[x].length; y++){
      
              result.push(arr[x][y])
      
              }
          }
      
          return result
      }
      
      
      alert (get1DArray(arrToConvert))
      

      http://jsfiddle.net/Saturnix/ReeqQ/

      【讨论】:

        【解决方案5】:

        怎么样:

        var arrToConvert = [[0,0,1],[2,3,3],[4,4,5]];
        
        function get1DArray(arr){
            return arr.join().split(",");
        }
        
        console.log(get1DArray(arrToConvert));
        

        http://jsfiddle.net/JRR4J/

        【讨论】:

        • 如果嵌套元素是对象而不是数字或字符串会怎样?
        • @MartyWallace ["0", "0", "1", "2", "3", "3", "4", "4", "5", "[object Object]"] 这就是发生的事情。我明白你的意思,我的解决方案只适用于字符串和数字。
        【解决方案6】:

        试试.concat():

        var arrToConvert = [[0,0,1],[2,3,3],[4,4,5]];
        var newArr = [];
        
        
        for(var i = 0; i < arrToConvert.length; i++)
        {
            newArr = newArr.concat(arrToConvert[i]);
        }
        
        console.log(newArr);
        

        【讨论】:

          猜你喜欢
          • 2014-04-23
          • 2021-07-20
          • 1970-01-01
          • 1970-01-01
          • 2020-05-06
          • 2020-09-10
          • 1970-01-01
          • 2021-09-25
          • 2016-02-18
          相关资源
          最近更新 更多