[javascript] .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가 내 프로젝트에 어떻게 적용했는지 추출 하는 방법에 대해서도 약간의 단서 가 없습니다 .

내가 여기서 놓친 것에 대한 명확하고 간결한 설명을 좋아할 것입니다. 감사!


ES6 Map , FYI 용 문서



답변

그래서 .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의 “regenerator”포함)을 사용해야합니다.
나는 그것이 포함되어 있다고 확신합니다 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);


답변

이 기능을 사용할 수 있습니다.

function mapMap(map, fn) {
  return new Map(Array.from(map, ([key, value]) => [key, fn(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 }
*/


답변

사용 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배열로 변환 한 후에도 원래 키로 Array.from. 첫 번째 항목은 이고 두 번째 항목은 변형 된 배열 을 반환하여 가능합니다 .keyvalue

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 }

해당 를 첫 번째 배열 항목으로 반환하지 않으면 가 손실 Map됩니다.


답변

지도를 확장하고 싶습니다

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;
  };
}