generator

我的github源码:https://github.com/shangyueyue/ssy-utils/blob/master/src/basetheory/generator.js

一、实现迭代器

function read(books) {
  let index = 0;
  return {
    next() {
      const done = index === books.length;
      const value = done ? undefined : books[index++]; // eslint-disable-line
      return {
        value,
        done,
      };
    },
  };
}
const it = read(['nodejs', 'css', 'js']);
let result;
do {
  result = it.next();
  console.log(result);
} while (!result.done);

二、gennerator 迭代

function* func(subjects) {
  let result;
  for (const item of subjects) {
    result = yield item;
    console.log(result);
  }
}
const subjects = ['js', 'html5', 'css'];
const iterater = func(subjects);
console.log(iterater.next());
console.log(iterater.next(9));
console.log(iterater.next(0));

三、递归遍历

function* flat(arr) {
  for (const item of arr) {
    if (Array.isArray(item)) {
      yield* flat(item);
    } else {
      yield item;
    }
  }
}
const arr = [1, [[2, 3], 4], [5, 6]];
const iterator = flat(arr);
let result;
do {
  result = iterator.next();
  console.log(result);
} while (!result.done);

三、symbal iterator 遍历

function* arrGenerator() {
  for (let i = 0; i < this.length; i++) {
    yield this[i] + 5;
  }
}
const arr = [1, 3, 4, 5];
arr[Symbol.iterator] = arrGenerator;
// const iterator = arrGenerator(arr);
for (const item of arr) {
  console.log(item);
}

实现对象的 for of

function* objGenerator() {
  for (const item of Object.keys(this)) {
    const key = item;
    const value = this[item];
    yield [key, value];
  }
}

const obj = {
  name: 'shangyueyue',
  age: 18,
};
obj[Symbol.iterator] = objGenerator;
for (const [key, value] of obj) {
  console.log(key, value);
}

 

posted @ 2019-05-16 09:28  shangyueyue  阅读(252)  评论(0编辑  收藏  举报