es6 map/set 从某个项目迭代(向后)
es6 map/set iterate from certain item (backwards)
这里是初学者,
我对 es6 set、map 和生成器有点迷茫。
如何 select 地图中的项目,然后从该点有效地向后迭代?最好不要遍历整个 set/map.
let v = myMap.get('key')
所以,从 'v' 到地图的开头(向后)?
谢谢!
您可能想要的是 keys
的 slice
从第一个元素到 key
的索引,反转它,迭代它并从中获取值地图.
我假设你的 map
是一个对象:
let keys = Object.keys(map);
return keys.slice(0, keys.indexOf('key')).map((k) => map[k]);
你真的不需要发电机。
您可以创建一组迭代助手,然后复合以创建您想要的效果:
/* 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)));
这里是初学者, 我对 es6 set、map 和生成器有点迷茫。
如何 select 地图中的项目,然后从该点有效地向后迭代?最好不要遍历整个 set/map.
let v = myMap.get('key')
所以,从 'v' 到地图的开头(向后)?
谢谢!
您可能想要的是 keys
的 slice
从第一个元素到 key
的索引,反转它,迭代它并从中获取值地图.
我假设你的 map
是一个对象:
let keys = Object.keys(map);
return keys.slice(0, keys.indexOf('key')).map((k) => map[k]);
你真的不需要发电机。
您可以创建一组迭代助手,然后复合以创建您想要的效果:
/* 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)));