.map () 자바 펼쳐 ES6 맵?
어떻게 하시겠습니까? 본능적으로 다음과 같이하고 싶습니다.
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
// wishful, ignorant thinking
var newMap = myMap.map((key, value) => value + 1); // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 }
새로운 반복 프로토콜에 대한 문서에서 많은 것을 얻지 .
나는 알고있다 wu.js ,하지만 난 실행 해요 바벨 프로젝트를하지 포함 싶어 Traceur , 그것이 현재에 의존하는 것 같다가 .
또한 fitzgen / wu.js가 내 프로젝트에 어떻게 적용했는지 추출 하는 방법에 대해서도 약간의 단서 가 없습니다 .
내가 여기서 놓친 것에 대한 명확하고 간결한 설명을 좋아할 것입니다. 감사합니다!
그래서 그 자체적으로로드하는 .map
당신이 관심을 하나의 가치만을 제공합니다 ... 즉, 해결하는 몇 가지 방법이 있습니다 :
// instantiation
const myMap = new Map([
[ "A", 1 ],
[ "B", 2 ]
]);
// what's built into Map for you
myMap.forEach( (val, key) => console.log(key, val) ); // "A 1", "B 2"
// what Array can do for you
Array.from( myMap ).map(([key, value]) => ({ key, value })); // [{key:"A", value: 1}, ... ]
// less awesome iteration
let entries = myMap.entries( );
for (let entry of entries) {
console.log(entry);
}
두 번째 예제에서는 많은 새로운 것을 사용하고 있습니다. ... ... Array.from
반복 가능한 모든 항목 (사용할 때마다 [].slice.call( )
세트 및지도 포함)을 사용하여 배열로 변환합니다. ...지도, 배열로 강제 변환하면 배열의 배열로 바 정렬됩니다 el[0] === key && el[1] === value;
(기본적으로 위의 예제 맵을 미리 채운 것과 동일한 형식으로).
각 el에 대한 객체를 반환하기 전에 람다의 인수 위치에서 배열의 구조를 사용하여 배열 지점을 값에 할당합니다.
Babel을 사용하는 경우 Babel의 브라우저 폴리 필 ( "core-js"및 Facebook의 "재생기"포함)을 사용합니다.
나는 그것이 포함되어 있다고 확신합니다 Array.from
.
Spread 연산자를 사용합니다.
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
var newArr = [...myMap].map(value => value[1] + 1);
console.log(newArr); //[2, 3, 4]
var newArr2 = [for(value of myMap) value = value[1] + 1];
console.log(newArr2); //[2, 3, 4]
사용하십시오 Array.from(iterable, [mapFn])
.
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
var newArr = Array.from(myMap.values(), value => value + 1);
실제로 Map
배열로 변환 한 후에도 원래 키로 Array.from
. 첫 번째 항목은 이고 두 번째 항목은 변형 된 배열 을 반환하여 가능합니다 .key
value
const originalMap = new Map([
["thing1", 1], ["thing2", 2], ["thing3", 3]
]);
const arrayMap = Array.from(originalMap, ([key, value]) => {
return [key, value + 1]; // return an array
});
const alteredMap = new Map(arrayMap);
console.log(originalMap); // Map { 'thing1' => 1, 'thing2' => 2, 'thing3' => 3 }
console.log(alteredMap); // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 }
해당 키 를 첫-th 배열 항목으로 반환하지 않으면 키 가 손실 Map
됩니다.
const mapMap = (callback, map) => new Map(Array.from(map).map(callback))
var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);
var newMap = mapMap((pair) => [pair[0], pair[1] + 1], myMap); // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 }
사용 Array.from
하여 값을 매핑하는 Typescript 함수를 작성했습니다.
function mapKeys<T, V, U>(m: Map<T, V>, fn: (this: void, v: V) => U): Map<T, U> {
function transformPair([k, v]: [T, V]): [T, U] {
return [k, fn(v)]
}
return new Map(Array.from(m.entries(), transformPair));
}
const m = new Map([[1, 2], [3, 4]]);
console.log(mapKeys(m, i => i + 1));
// Map { 1 => 3, 3 => 5 }
사전에 전체 Map을 배열로 변환하거나 키-값 배열을 구조화하지 않고 다음과 같은 어리석은 함수를 사용할 수 있습니다.
/**
* Map over an ES6 Map.
*
* @param {Map} map
* @param {Function} cb Callback. Receives two arguments: key, value.
* @returns {Array}
*/
function mapMap(map, cb) {
let out = new Array(map.size);
let i = 0;
map.forEach((val, key) => {
out[i++] = cb(key, val);
});
return out;
}
let map = new Map([
["a", 1],
["b", 2],
["c", 3]
]);
console.log(
mapMap(map, (k, v) => `${k}-${v}`).join(', ')
); // a-1, b-2, c-3
Map.prototype.map = function(callback) {
const output = new Map()
this.forEach((element, key)=>{
output.set(key, callback(element, key))
})
return output
}
const myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]])
// no longer wishful thinking
const newMap = myMap.map((value, key) => value + 1)
console.info(myMap, newMap)
종류 유형 편집을 피하려는 종교적 열의에 따라 다르지만, 이것이 완성으로 사용할 수 있습니다.
지도를 확장하고 싶습니다.
export class UtilMap extends Map {
constructor(...args) { super(args); }
public map(supplier) {
const mapped = new UtilMap();
this.forEach(((value, key) => mapped.set(key, supplier(value, key)) ));
return mapped;
};
}
map () 배열을 사용할 수 있지만 Maps에 대한 이러한 작업은 없습니다. Axel Rauschmayer 박사 의 솔루션 :
- 맵을 [키, 값] 쌍의 배열로 변환합니다.
- 배열을 매핑하거나 필터링합니다.
- 결과를 다시지도로 변환합니다.
예:
let map0 = new Map([
[1, "a"],
[2, "b"],
[3, "c"]
]);
const map1 = new Map(
[...map0]
.map(([k, v]) => [k * 2, '_' + v])
);
결과
{2 => '_a', 4 => '_b', 6 => '_c'}
myMap.forEach를 사용하고 각 루프에서 map.set을 사용하여 값을 변경할 수 있습니다.
myMap = new Map([
["a", 1],
["b", 2],
["c", 3]
]);
for (var [key, value] of myMap.entries()) {
console.log(key + ' = ' + value);
}
myMap.forEach((value, key, map) => {
map.set(key, value+1)
})
for (var [key, value] of myMap.entries()) {
console.log(key + ' = ' + value);
}
이 기능을 사용할 수 있습니다.
function mapMap(map, callback) {
return new Map(Array.from(map).map(([key, value]) => [key, callback(value, key, map)]));
}
용법:
var map1 = new Map([["A", 2], ["B", 3], ["C", 4]]);
var map2 = mapMap(map1, v => v * v);
console.log(map1, map2);
/*
Map { A → 2, B → 3, C → 4 }
Map { A → 4, B → 9, C → 16 }
*/
참고 URL : https://stackoverflow.com/questions/31084619/map-a-javascript-es6-map
'ProgramingTip' 카테고리의 다른 글
webSocket을 사용하여 특정 사용자에게 메시지를 보내 시나요? (0) | 2020.11.21 |
---|---|
java.lang.NumberFormatException을 어떻게해야합니까? 입력의 경우 :“N / A”? (0) | 2020.11.21 |
const, let 및 var의 v8 JavaScript 성능 영향? (0) | 2020.11.21 |
이벤트 처리기를 등록 취소하는 방법 (0) | 2020.11.21 |
NULL을 허용하는 MySQL 외래 키? (0) | 2020.11.21 |