JavaScript实现数组降维详解

作者:纸飞机

时间:2026-10-21

浏览:407

本文详细解析JavaScript中数组降维的多种实现方式。针对二维数组,介绍双重循环、concat合并及apply结合concat的技巧;针对多维数组,深入讲解基于原型链的递归方法与利用栈结构的迭代方案,帮助开发者根据场景选择合适算法。

文章目录

二维数组降维方法

二维数组降维

二维数组仅包含两个维度,处理相对简单,无需复杂算法逻辑。接下来我们将探讨几种实现二维数组降维的具体方法;

遍历降维


var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0; r < arr.length; r++) {
  for (var c = 0; c < arr[r].length; c++) {
    result.push(arr[r][c]);
  }
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

该思路直观,通过双重循环遍历二维数组中的每个元素,并将其逐一添加至新数组中。

使用concat

利用concat方法,可以将原本的双重循环简化为单重循环:


var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0, result = []; r < arr.length; r++) {
  result = result.concat(arr[r]);
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

arr的每一个元素均为数组或参数,作为concat方法的参数传入时,数组中的参数或每个子元素会被独立插入到新数组中。

使用apply+concat

apply方法用于调用一个函数,其第一个参数指定被调用函数的this值,第二个参数(数组或类数组对象)则作为被调用对象的arguments值,即该数组的各个元素将依次成为被调用函数的各个参数;


var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = Array.prototype.concat.apply([], arr);
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

借助apply方法,仅需一行代码即可完成二维数组的降维操作。

多维数组降维实现

多维数组降维

多维数组的处理不如二维数组简单,由于数组深度不确定,无法通过固定层级的遍历进行降维,必须借助递归或栈方法来实现。

递归


Array.prototype.deepFlatten = function() {
  var result = []; //定义保存结果的数组
  this.forEach(function(val, idx) { //遍历数组
    if (Array.isArray(val)) { //判断是否为子数组
      val.forEach(arguments.callee); //为子数组则递归执行
    } else {
      result.push(val); //不为子数组则将值存入结果数组中
    }
  });
  return result; //返回result数组
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

此处通过递归方法实现多维数组的降维,并使用了原型链将该方法封装进Array原型中,以便直接在数组实例上调用。

栈方法


Array.prototype.deepFlatten = function() {
  var result = []; //定义保存结果的数组
  var stack = this; //将数组放入栈中
  while (stack.length !== 0) { //如果栈不为空,则循环遍历
    var val = stack.pop(); //取出最后一个值
    if (Array.isArray(val)) { //判断是不是数组
      stack = stack.concat(val); //如果是数组就将拼接入栈中
    } else {
      result.unshift(val); //如果不是数组就将其取出来放入结果数组中
    }
  }
  return result;
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

这是通过栈方法实现的方案,建立了一个栈结构,将数组内容存入其中,然后逐个取出。若取出的元素是数组,则将其打散并拼接回栈中,再取出下一个元素,如此循环往复。

多维数组降维的方法同样适用于降维二维数组,但这属于大材小用。选择合适的方法处理对应的问题才是最佳实践!

总结

以上就是本文的全部内容,希望这些内容能对您的学习或工作有所帮助。如有任何疑问,欢迎留言交流。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章