Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

Codewars 練習 08:比較巢狀結構

問題

定義一個陣列物件的方法 sameStructureAs,用來比較兩個陣列的巢狀結構是否相同。

舉例來說 [1, 2, 3, [4, 5]][ 2, 3, 4, [1, 2]] 有一樣的結構。

我的解法

Array.prototype.sameStructureAs = function (other) {
    const that = this;
    if ( typeof(that) !== typeof(other) ) return false;
    if ( Array.isArray( other ) !== true ) return false;
    for ( var i = 0; i < that.length; i++ ){
      if ( Array.isArray(that[i]) ) {
        if ( that[i].length !== other[i].length ) return false;
        return that[i].sameStructureAs( other[i] );
      } else {
        if ( Array.isArray(other[i])  ) return false;
      }
    }
    return true;
};

票選最佳解法

Array.prototype.sameStructureAs = function (other) {
    return (this.length === other.length) ? this.every(function(el, i){
      return Array.isArray(el) ? el.sameStructureAs(other[i]) : true;
    }) : false;
};

改善點

這次的解法比較土炮,雖然使用了遞回函式,但還是寫了太多的判斷式。

這裡凸顯了對演算法的差異,最一開始透過 length 的比較,如果兩者都是單一值,則會變成 undefined === undefined,回傳 true

Array.prototype.every()

接著使用了 Array.prototype.every() 這個方法,只要當前元素是單一值,便回傳 true,如果是陣列,則透過遞迴函式的方式再檢查一次。由於 every() 方法必須要全部回傳 true 才會回傳 true,因此如果檢驗的過程中有不符合的狀況,最終的結果便會是 false

參考資料

Eric Chuang
Eric Chuang

正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料