3、flat函数设计

 

算法题

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

输出:a,b,c,2,d,e,f,g,3,4

 

const arr = ['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]
    // 方式一:递归(代码太多已省略)
    // 方式二:toString(格式转换) 隐式类型转换   [1,2,3].toString() = 1,2,3
    // 方式三:valueOf(格式转化),和toString差不多,把toString换成valueOf
    /*const flag = (arr) => {
      let toString = Array.prototype.toString
      Array.prototype.toString = function() {   // 改变
        return this.join(',')
      }
      Array.prototype.toString = toString   // 还原
      return arr + ''  // 隐式类型转换,这里arr会先调用valueOf结果返回不是基本数据类型则继续调用toString然后结束,否则会报错
    }
    console.log(flag(arr))*/

    // 方式四: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()
        return first
      }
      return {  // 遍历器必须返回对象,并且有next()方法
        next() {
          let item = getFirst(arr)
          if (item) {
            return {
              value: item,  // 返回的值,如果item是数组则调toString
              done: false   // 是否遍历结束
            }
          } else {
            return {
              done: true
            }
          }
        }
      }
    }
    const flag = function (arr){
        let r = []
        for (let i of arr) { r.push(i) }
        return r.join(',')
    }
    console.log(flag(arr))
posted @ 2019-01-28 16:25  Sampson1207  阅读(713)  评论(0编辑  收藏  举报