반복기에서 맵() 사용
지도가 있다고 가정합니다.let m = new Map();
,사용.m.values()
맵 반복기를 반환합니다.
하지만 사용할 수 없습니다.forEach()
아니면map()
ES6가 다음과 같은 기능을 제공하기 때문에 해당 반복기에 잠시 루프를 구현하는 것은 안티패턴처럼 보입니다.map()
.
그래서 사용할 수 있는 방법이 있습니까?map()
반복기로?
이를 수행하는 가장 단순하고 가장 성능이 낮은 방법은 다음과 같습니다.
Array.from(m).map(([key,value]) => /* whatever */)
아직은 더 낫습니다.
Array.from(m, ([key, value]) => /* whatever */))
Array.from
반복 가능하거나 배열과 같은 모든 것을 가져와 배열로 변환합니다!Daniel이 코멘트에서 지적한 것처럼, 우리는 변환에 매핑 함수를 추가하여 반복을 제거하고 그 후에 중간 배열을 제거할 수 있습니다.
사용.Array.from
@hraban님이 댓글로 지적해주신 것처럼 에서 로 공연을 옮겨드립니다.부터m
가Map
, 그들이 무한할 수는 없고, 우리는 무한한 서열에 대해 걱정할 필요가 없습니다.대부분의 경우 이 정도면 충분합니다.
지도를 우회하는 몇 가지 다른 방법이 있습니다.
사용.forEach
m.forEach((value,key) => /* stuff */ )
사용.for..of
var myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one
여기 다른 대답은...이상하다.반복 프로토콜의 일부를 다시 구현하는 것 같습니다.그냥 이렇게 하면 됩니다.
function* mapIter(iterable, callback) {
for (let x of iterable) {
yield callback(x);
}
}
그리고 구체적인 결과를 원한다면 그냥 퍼짐 연산자를 사용하세요....
.
[...mapIter([1, 2, 3], x => x**2)]
이를 루프오버하기 위해 다른 반복기 함수를 정의할 수 있습니다.
function* generator() {
for (let i = 0; i < 10; i++) {
console.log(i);
yield i;
}
}
function* mapIterator(iterator, mapping) {
for (let i of iterator) {
yield mapping(i);
}
}
let values = generator();
let mapped = mapIterator(values, (i) => {
let result = i*2;
console.log(`x2 = ${result}`);
return result;
});
console.log('The values will be generated right now.');
console.log(Array.from(mapped).join(','));
이제 여러분은 다음과 같이 물을 수 있습니다.Array.from
대신에?이 작업은 전체 반복기를 통해 실행되므로 (임시) 배열에 저장하고 다시 반복한 다음 매핑을 수행합니다.목록이 방대한 경우(또는 잠재적으로 무한대인 경우) 불필요한 메모리 사용으로 이어집니다.
물론 품목 리스트가 상당히 작다면, 다음과 같이Array.from
충분해야 합니다.
이 가장 단순하고 가장 수행적인 방법은 두 번째 인수를 사용하여 이를 달성하는 것입니다.
const map = new Map()
map.set('a', 1)
map.set('b', 2)
Array.from(map, ([key, value]) => `${key}:${value}`)
// ['a:1', 'b:2']
이 접근 방식은 무한 반복이 불가능한 모든 것에 효과가 있습니다.이를 통해 별도의 전화를 사용하지 않아도 됩니다.Array.from(map).map(...)
두 번이나 반복할 수 있고 성능에 더 좋지 않을 겁니다
다양한 도우미 기능을 제공하는 제안이 있습니다.Iterator
: https://github.com/tc39/proposal-iterator-helpers (rendered)
다음을 활용하여 지금 바로 사용할 수 있습니다.
import { from as iterFrom } from "core-js-pure/features/iterator";
// or if it's working for you (it should work according to the docs,
// but hasn't for me for some reason):
// import iterFrom from "core-js-pure/features/iterator/from";
let m = new Map();
m.set("13", 37);
m.set("42", 42);
const arr = iterFrom(m.values())
.map((val) => val * 2)
.toArray();
// prints "[74, 84]"
console.log(arr);
반복기를 통해 반복기를 검색한 다음 각 반복 요소에서 매핑 콜백 함수를 호출하는 다른 반복기를 반환할 수 있습니다.
const map = (iterable, callback) => {
return {
[Symbol.iterator]() {
const iterator = iterable[Symbol.iterator]();
return {
next() {
const r = iterator.next();
if (r.done)
return r;
else {
return {
value: callback(r.value),
done: false,
};
}
}
}
}
}
};
// Arrays are iterable
console.log(...map([0, 1, 2, 3, 4], (num) => 2 * num)); // 0 2 4 6 8
https://www.npmjs.com/package/fluent-iterable 에서 만나보세요.
모든 반복 변수(Map, generator function, array) 및 비동기 변수와 함께 작동합니다.
const map = new Map();
...
console.log(fluent(map).filter(..).map(..));
배열과 유사한 메소드를 구현하는 itiri를 사용할 수 있습니다.
import { query } from 'itiriri';
let m = new Map();
// set map ...
query(m).filter([k, v] => k < 10).forEach([k, v] => console.log(v));
let arr = query(m.values()).map(v => v * 10).toArray();
타이프스크립트 버전이 필요한 경우:
function* mapIter<T1, T2>(iterable: IterableIterator<T1>, callback: (value: T1) => T2) {
for (let x of iterable) {
yield callback(x);
}
}
MartyO256(https://stackoverflow.com/a/53159921/7895659), 의 답변을 바탕으로 리팩토레이티드 타이프스크립트 접근 방식은 다음과 같습니다.
function mapIterator<TIn, TOut>(
iterator: Iterator<TIn>,
callback: (input: TIn) => TOut,
): Iterator<TOut> {
return {
next() {
const result: IteratorResult<TIn> = iterator.next();
if (result.done === true) {
return result;
} else {
return {
done: false,
value: callback(result.value),
};
}
},
};
}
export function mapIterable<TIn, TOut>(
iterable: Iterable<TIn>,
callback: (input: TIn) => TOut,
): Iterable<TOut> {
const iterator: Iterator<TIn> = iterable[Symbol.iterator]();
const mappedIterator: Iterator<TOut> = mapIterator(iterator, callback);
return {
[Symbol.iterator]: () => mappedIterator,
};
}
언급URL : https://stackoverflow.com/questions/43885365/using-map-on-an-iterator
'programing' 카테고리의 다른 글
NoSQL 데이터 저장소를 사용하는 데 어떤 확장성 문제가 발생했습니까? (0) | 2023.11.06 |
---|---|
Python 3에서 문자열 리터럴 앞에 있는 'b' 문자 do 제거 (0) | 2023.11.06 |
구글은 URL에서 검색 대신 #를 사용합니다. 왜죠? (0) | 2023.11.06 |
각도 자재 테이블에서 행 인덱스 가져오기 v5 (0) | 2023.11.06 |
한 컨트롤러에서 언로드하기 전에 AngularJS window.on이 다른 컨트롤러에서 트리거됨 (0) | 2023.11.06 |