2017-09-26 76 views
1

在ES6中,有沒有可能克隆一個迭代器狀態?如何在JavaScript中克隆迭代器?

var ma=[1,2,3,4]; 
var it=ma[Symbol.iterator](); 
it.next(); 

如果我想在這裏記住它說明我應該怎麼做javascritp?

什麼是在它裏面? 自

JSON.stringify(it) //it would just return {} 

回答

0

您無法克隆任意迭代器,但你可以從一個由持有到一些國家創造了許多不同的迭代器:

function tee(iterable) { 
    const source = iterable[Symbol.iterator](); 
    const buffers = [[], []]; // substitute in queue type for efficiency 
    const DONE = Object.create(null); 

    const next = i => { 
     if (buffers[i].length !== 0) { 
      return buffers[i].shift(); 
     } 

     const x = source.next(); 

     if (x.done) { 
      return DONE; 
     } 

     buffers[1 - i].push(x.value); 
     return x.value; 
    }; 

    return buffers.map(function* (_, i) { 
     for (;;) { 
      const x = next(i); 

      if (x === DONE) { 
       break; 
      } 

      yield x; 
     } 
    }); 
} 

用法:

const [a, b] = tee(iterator); 
assert(a.next().value === b.next().value); 
2

不可能克隆迭代器。迭代器狀態基本上是完全任意的,任何給定的迭代器可能需要或產生副作用(例如從網絡流讀取或寫入網絡流),這些副作用是不可重複的。