freeCodeCamp/guide/chinese/certifications/javascript-algorithms-and-d.../intermediate-algorithm-scri.../steamroller/index.md

6.4 KiB
Raw Blame History

title localeTitle
Steamroller 压路机

:triangular_flag_on_post:如果卡住,请记得使用**Read-Search-Ask** 。尝试配对程序:busts_in_silhouette:并编写自己的代码:pencil:

:checkered_flag:问题说明:

这个问题看起来很简单,但你需要确保扁平化任何数组,无论级别是什么,这会给问题增加一些难度。

相关链接

:speech_balloon:提示1

您需要检查元素是否是数组。

现在尝试解决问题

:speech_balloon:提示2

如果您正在处理数组,那么您需要通过获取数组内的值来展平它。这意味着如果你有[4]然后而不是返回[4]你需要返回4.如果你得到[[[4]]]那么相同你想要4.你可以用arr [index1]访问它[index2]更深层次。

现在尝试解决问题

[speech_balloon提示3

您肯定需要递归或其他方式来超越两级数组,以使代码灵活,而不是硬编码到所需的答案。玩的开心!

现在尝试解决问题

扰流警报!

警告牌

提前解决!

:beginner:基本代码解决方案

function steamrollArray(arr) { 
  var flattenedArray = []; 
 
  // Create function that adds an element if it is not an array. 
  // If it is an array, then loops through it and uses recursion on that array. 
  var flatten = function(arg) { 
    if (!Array.isArray(arg)) { 
      flattenedArray.push(arg); 
    } else { 
      for (var a in arg) { 
        flatten(arg[a]); 
      } 
    } 
  }; 
 
  // Call the function for each element in the array 
  arr.forEach(flatten); 
  return flattenedArray; 
 } 
 
 // test here 
 steamrollArray([1, [2], [3, [[4]]]]); 

代码说明:

  • 创建一个新变量以保持展平的数组。
  • 创建一个将非数组元素添加到新变量的函数,对于那些数组,它循环遍历它们以获取元素。
  • 它通过使用递归来实现,如果元素是一个数组,那么再次使用一层数组调用该函数来检查它是否是一个数组。如果不是那么将非数组元素推送到返回的变量。否则,继续深入。
  • 调用该函数第一次总是将它传递给一个数组因此它总是落入isArray分支
  • 返回展平的数组。

相关链接

:sunflower:中级代码解决方案:

function steamrollArray(arr) { 
  let flat = [].concat(...arr); 
  return flat.some(Array.isArray) ? steamrollArray(flat) : flat; 
 } 
 
 flattenArray([1, [2], [3, [[4]]]]); 

代码说明:

  • 使用spread运算符将arr每个元素与一个空数组连接起来
  • 使用Array.some()方法查明新数组是否仍包含数组
  • 如果是这样,再次使用递归调用steamrollArray ,传入新数组以在深度嵌套的数组上重复该过程
  • 如果没有,则返回展平的阵列

相关链接

:rotating_light:高级代码解决方案

function steamrollArray(arr) { 
  return arr.toString() 
    .replace(',,', ',')       // "1,2,,3" => "1,2,3" 
    .split(',')               // ['1','2','3'] 
    .map(function(v) { 
      if (v == '[object Object]') { // bring back empty objects 
        return {}; 
      } else if (isNaN(v)) {        // if not a number (string) 
        return v; 
      } else { 
        return parseInt(v);         // if a number in a string, convert it 
      } 
    }); 
 } 

代码说明:

  • 首先,我们将数组转换为一个字符串,它将为我们提供一个由逗号分隔的数字字符串,如果有空数组,则为双逗号;如果有对象则为文字对象文本我们稍后可以在if语句中修复它。
  • 我们用一个替换双逗号,然后将它分成一个数组。
  • 映射数组并修复对象值并将字符串数转换为常规数。

:clipboard:捐款说明:

  • :warning: 请勿添加与任何现有解决方案类似的解决方案。如果您认为它**相似但更好** ,那么尝试合并(或替换)现有的类似解决方案。
  • 添加解决方案的说明。
  • 将解决方案分为以下类别之一 - 基本 中级高级:traffic_light:

看到:point_right: Wiki Challenge Solution Template供参考。