1.JS算法-扁平化输出

152 阅读1分钟

JS算法题目

输入:['a',[b,c],2,['d','e','f'],'g',3,4] 输出:a,b,c,2,d,e,f,g,3,4

解题思路

  1. 递归
  2. toString格式转换
  3. valueOf格式转换
  4. ES6遍历器 Symbol.iterator

1. 递归

// 方法一:递归
      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));

2. 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));

3. 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]));

ES6遍历器 Symbol.iterator

// 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;
  //};
  let getFirst = function(array){
      let first = array.shift();
      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); }
  return r.join(',');
};
var arr = ['a', ['b', 'c'], '2', ['d', 'e', 'f'], 'g', 3, 4];
console.log(flat(arr));