前端100问

【前端100问】Q36:使用迭代的方式实现 flatten 函数

2021-01-01  本文已影响0人  alanwhy

写在前面

此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
使用迭代的方式实现 flatten 函数
简书整合地址:前端 100 问

正文回答

let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]];

// some() 方法用于检测数组中的元素是否满足指定条件(函数提供)
// some() 不会对空数组进行检测。
// some() 不会改变原始数组。
// array.some(function(currentValue,index,arr),thisValue)
const flatten = function (arr) {
  while (arr.some((item) => Array.isArray(item))) {
    arr = [].concat(...arr);
  }
  return arr;
};

console.log(flatten(arr));

// 递归的实现(ES6简写)
// reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
const flatten = (array) =>
  array.reduce(
    (acc, cur) =>
      Array.isArray(cur) ? [...acc, ...flatten(cur)] : [...acc, cur],
    []
  );

关于 reduce 的使用

var aa = [1, 2, 3, 4, 5];

/**
 * @parmas total 必需。初始值, 或者计算结束后的返回值。
 * @parmas currentValue 必需。当前元素
 * @parmas currentIndex 可选。当前元素的索引
 * @parmas arr 可选。当前元素的索引
 * @parmas initialValue 可选。传递给函数的初始值
 */
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

// first method

aa.reduce((total, currentValue, currentIndex, arr) => {
  console.log(total, currentValue, currentIndex, arr);
});

// 1 2 1 (5) [1, 2, 3, 4, 5]
// undefined 3 2 (5) [1, 2, 3, 4, 5]
// undefined 4 3 (5) [1, 2, 3, 4, 5]
// undefined 5 4 (5) [1, 2, 3, 4, 5]
// undefined

// second method
aa.reduce((total, currentValue, currentIndex, arr) => {
  console.log(total, currentValue, currentIndex, arr);
  return total + currentValue;
});

// 1 2 1 (5) [1, 2, 3, 4, 5]
// 1 3 3 2 (5) [1, 2, 3, 4, 5]
// 1 6 4 3 (5) [1, 2, 3, 4, 5]
// 1 10 5 4 (5) [1, 2, 3, 4, 5]
// 15

// third method
aa.reduce((total, currentValue, currentIndex, arr) => {
  console.log(total, currentValue, currentIndex, arr);
  return total + currentValue;
}, 10);

// 10 1 0 (5) [1, 2, 3, 4, 5]
// 1 11 2 1 (5) [1, 2, 3, 4, 5]
// 1 13 3 2 (5) [1, 2, 3, 4, 5]
// 1 16 4 3 (5) [1, 2, 3, 4, 5]
// 1 20 5 4 (5) [1, 2, 3, 4, 5]
// 25
// 字符串转换
arr.join(',').split(',').map(item => Number(item)))
上一篇下一篇

猜你喜欢

热点阅读