天天看點

6種實作JavaScript數組拍平/扁平化的方法總彙

6種實作JavaScript數組拍平/扁平化的方法總彙

題目:

請寫出一個數組拍平函數,效果如下:

var arr=['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]; 
flat(arr) //a,b,c,2,d,e,f,g,3,4      

方法一:使用toString方法先将arr轉換為一個字元串, 再以split分割為數組,再将數組裡面的元素轉換為數字類型

var arr =['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4];
function flat(arr) {
  return arr.toString().split(',').map(function(item){
       return Number(item)
  })
}
console.log(flat(arr))      

方法二:toString 格式轉換 與方法一類似 都是隐士類型轉換  

var arr = ['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4];
// 方法二:toString(格式轉換)
var flag = function(arr) {
  let toString = Array.prototype.toString;
  Array.prototype.toString = function() {
    return this.join(',');
  };
  let result = arr + '';
  Array.prototype.toString = toString;
  return result;
};


console.log(flag(arr));      

方法三:valueOf(格式轉換) 與方法一 二類似 都是隐士類型轉化原理  

// 方法三:valueOf(格式轉換)
Array.prototype.valueOf = function() {
  return this.join(',');
};


var flat = function(arr) {
  return arr + '';
};
console.log(flat(['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]));      

方法四: 利用reduce特性

function flat(arr) {
  return newArr = arr.reduce((a, b) => {
    return a.concat(b)
  }, [])
}
var arr = ['a', ['b', 'c'], '2', ['d', 'e', 'f'], 'g', 3, 4];
console.log(flat(arr));      

方法五:利用遞歸  

function flat(array) {
  var result = [];
  var each = function(arr) {
    arr.forEach(item => {
      if (item instanceof Array) {
        each(item);
      } else {
        result.push(item);
      }
    });
  };
  each(array);
  return result.join(',');
}
var arr = ['a', ['b', 'c', [7, 8]], 2, ['d', 'e', 'f'], 'g', 3, 4];
console.log(flat(arr));      

方法六:ES6的周遊器 Iterator 給資料結構增加周遊器必須增加一個next方法 

// Iterator
Array.prototype[Symbol.iterator] = function() {
  let arr = [].concat(this);
  // arr=['a', ['b', 'c'], '2', ['d', 'e', 'f'], 'g', 3, 4]
  let getFirst = function(array) {
    let first = array.shift();
    if (first instanceof Array) {
      if (first.length > 1) {
        arr = first.slice(1).concat(array);
      }
      first = first[0];
    }
    return first;
  };
  return {
    next: function() { //類似與周遊
      let item = getFirst(arr);
      if (item) {
        return {
          value: item,
          done: false,
        };
      } else {
        return {
          done: true,
        };
      }
    },
  };
};
var flat = function(arr) {
  let r = [];
  for (let i of arr) {
    r.push(i);
  } // i 已經是單個元素
  return r.join(',');
};
var arr = ['a', ['b', 'c'], '2', ['d', 'e', 'f'], 'g', 3, 4];
console.log(flat(arr));      

本文完~