doctrine find的对象转换成数组_[30秒JS 数组篇] 3. 迭代器Iterators是什么,怎么用?...

c7512278bf18b24e30291df2a37056fa.png

JavaScript迭代器是在ES6中引入的,它们用于循环遍历一系列值,通常是某种集合。根据定义,迭代器必须实现next()函数,该函数以{value,done}的形式返回一个对象,其中value是迭代序列中的下一个值,done是一个布尔值,确定序列是否已经被消耗。

一个非常简单的迭代器,在现实世界的项目中具有实际用途,可以如下所示:

下面代码实现的是让对象数组按照next字段的顺序去遍历

class LinkedList {
  constructor(data) {
    this.data = data;
  }

  firstItem() {
    return this.data.find(i => i.head);
  }

  findById(id) {
    return this.data.find(i => i.id === id);
    // find方法返回找到满足条件的第一个
  }

  [Symbol.iterator]() {
    // 迭代器 固定写法
    // [Symbol.iterator] 返回一个对象的无参函数,被返回对象符合迭代器协议
    let item = {next: this.firstItem().id};
    return {
      next: () => {
        item = this.findById(item.next);
        if(item) {
          return {value: item.value, done: false};
        }
        return {value: undefined, done: true};
      }
      // next 返回一个对象,
      // 对象包含 done 和 value 属性。
      // 其中 done 表示遍历是否结束,value 返回当前遍历的值。
    };
  }
}

const myList = new LinkedList([
  {id: 'a10', value: 'First', next: 'a13', head: true },
  {id: 'a11', value: 'Last', next: null, head: false },
  {id: 'a12', value: 'Third', next: 'a11', head: false },
  {id: 'a13', value: 'Second', next: 'a12', head: false }
]);

for(let item of myList) {
  console.log(item);    // 'First', 'Second', 'Third', 'Last'
}

与此相关的是,迭代器只是函数,这意味着它们可以像任何其他函数一样被调用(例如,将迭代委托给现有的迭代器),同时也不限于Symbol. iterator名称,允许我们为同一对象定义多个迭代器。以下是这些概念的一个例子:

class SpecialList {
  constructor(data) {
    this.data = data;
  }

  [Symbol.iterator]() {
    return this.data[Symbol.iterator]();
  }

  values() {
    return this.data
      .filter(i => i.complete)
      .map(i => i.value)
      [Symbol.iterator]();
  }
}

const myList = new SpecialList([
  {complete: true, value: 'Lorem ipsum'},
  {complete: true, value: 'dolor sit amet'},
  {complete: false},
  {complete: true, value: 'adipiscing elit'}
]);

for(let item of myList) {
  console.log(item);  // The exact data passed to the SpecialList constructor above
}

for(let item of myList.values()) {
  console.log(item);  // 'Lorem ipsum', 'dolor sit amet', 'adipiscing elit'
}


在本例中,我们使用数据对象的本机数组迭代器使我们的SpecialList 可迭代,返回数据数组的确切值。同时,我们还定义了一个值方法,它本身是一个迭代器,在数据数组上使用Array.prototype.filter()和Array.prototype.map(),然后最后返回结果的Symbol. iterator,只允许迭代序列中的非空对象,并只返回每个对象的值。

https://www.30secondsofcode.org/blog/s/javascript-iterators

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值