Dictionary es6映射/设置从特定项迭代(向后)

Dictionary es6映射/设置从特定项迭代(向后),dictionary,set,ecmascript-6,Dictionary,Set,Ecmascript 6,这里的初学者, 我对es6set、map和生成器有点迷茫 如何在地图中选择一个项目,然后从该点向后有效地迭代?最好不用看整套地图 let v = myMap.get('key') 那么,从“v”到地图的开头(向后) 谢谢大家! 您可能需要的是从第一个元素到键的索引的键的切片,将其反转,迭代,然后从映射中获取值 我假设您的地图是一个对象: let keys = Object.keys(map); return keys.slice(0, keys.indexOf('key')).map((k)

这里的初学者, 我对es6setmap和生成器有点迷茫

如何在地图中选择一个项目,然后从该点向后有效地迭代?最好不用看整套地图

let v = myMap.get('key')
那么,从“v”到地图的开头(向后)


谢谢大家!

您可能需要的是从第一个元素到
键的索引的
键的
切片
,将其反转,迭代,然后从映射中获取值

我假设您的
地图
是一个对象:

let keys = Object.keys(map);
return keys.slice(0, keys.indexOf('key')).map((k) => map[k]);

您实际上不需要生成器。

您可以创建一组迭代帮助器,然后合成以创建您想要的效果:

然后,您可以像这样使用和合成:


Object.keys()
根本无法获取密钥。如果有什么
Map.prototype.keys()
可以,但我不认为这有助于阻止迭代整个Map条目。我为不知道ES6中是否存在Map而感到羞耻:/@Bergi-有什么建议吗?没有真正的建议-
Map
s和
Set
s只是没有为反向或部分迭代提供API。如果你真的必须这样做,我想转换成数组并使用
切片
会更有效。顺便说一句,
=
操作符看起来是个错误。写出来比在布尔值上使用逐位整数运算符更好。@Bergi-理解你关于if条件的观点-这样可读性更好一些。关于
slice
,我不认为这会提高效率,函数仍然应该
产生
值,那么首先切片有什么意义呢?
/* iterTo iterates the iterable from the start and up to (inclusive) key is found.
The function "understands" the Map type when comparing keys as well as
any other iterables where the value itself is the key to match. */
function* iterTo(iterable, key) {
  for(let i of iterable) {
    yield i;
    if((iterable instanceof Map && i[0] === key) || i === key)
      return;
  }
}

// Same as iterTo, but starts at the key and goes all the way to the end
function* iterFrom(iterable, key) {
  let found = false;
  for(let i of iterable) {
    if(found = (found || (iterable instanceof Map && i[0] === key) || i === key))
      yield i;
  }
}

// reverseIter creates a reverse facade for iterable
function* reverseIter(iterable) {
  let all = [...iterable];
  for(let i = all.length; i--; )
    yield all[i];
}
let m = new Map();
m.set(1, 'a');
m.set(2, 'b');
m.set(3, 'c');
m.set(4, 'd');
m.set(5, 'e');

let s = new Set();
s.add(100);
s.add(200);
s.add(300);
s.add(400);


console.log(...iterTo(m, 3), ...iterFrom(m, 3));
console.log(...reverseIter(iterTo(m, 3)), ...reverseIter(iterFrom(m, 3)));

console.log(...reverseIter(iterTo(s, 200)));