Steamroller

What is "Streamroller" ?

題目的意思我想大家看上面那張圖應該很清楚可以知道是壓路機,而為何此題會以壓路機命名? 原因當然是因為跟題目有關,題目會給一個用多層array包含的一個array裡面包含各種元素,Ex: [1, {}, [3, [[4]]]],像例子所舉的樣子,一個array裡面有好幾層陣列包含,而非我們平常看到的多維陣列(multidimensional array),也就是我們習以為常的空間三維座標那種這列,如果讀者要想像的話,大概就像魔術方塊吧,而此題要求是要找出此array中所有的元素並返回一個平常我們較常使用的一維array(one-dimentional array),把多層的array壓平成一個array,題意由此而來

  function steamroller(arr) {
  // I'm a steamroller, baby
  var newArr = [];
  function rollor(emt)
  {
    emt.forEach(function(emt)
    {
      if(Array.isArray(emt))
        return rollor(emt);
      else
        newArr.push(emt);
    });
  }
  rollor(arr);
  return newArr ;
}

steamroller([1, [2], [3, [[4]]]]);
steamroller([[["a"]], [["b"]]]);
steamroller([1, [2], [3, [[4]]]]);
steamroller([1, [], [3, [[4]]]]);
steamroller([1, {}, [3, [[4]]]]);

測試的正確結果

steamroller([[["a"]], [["b"]]]) 應該返回 ["a", "b"]。 steamroller([1, [2], [3, [[4]]]]) 應該返回 [1, 2, 3, 4]。 steamroller([1, [], [3, [[4]]]]) 應該返回 [1, 3, 4]。 steamroller([1, {}, [3, [[4]]]]) 應該返回 [1, {}, 3, 4]。

Solution:

題目提供了一個函數Array.isArray(),其功用為判斷某個值是否為array,如果是則return true,否則return false,然後利用forEach來達到訪問此array的每個位置的元素的目的,並用這個函數確認是否為陣列如果是則用遞迴呼叫自身,在做更進一步的seaerch(往array更深處探訪),而如果是否則確認是元素,將元素將入新的array之中;以下是一些Array.isArray()的return值相關的導覽

// 下面的函數調用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鮮為人知的事實:其實 Array.prototype 也是一個數組。
Array.isArray(Array.prototype); 

// 下面的函數調用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype });

P.S. / Reference:  Array.isArray()

Last updated