ProgramingTip

.map () 자바 펼쳐 ES6 맵?

bestdevel 2020. 11. 21. 09:30
반응형

.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의 "재생기"포함)을 사용합니다.
나는 그것이 포함되어 있다고 확신합니다 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. 첫 번째 항목은 이고 두 번째 항목은 변형 배열 을 반환하여 가능합니다 .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 }

해당 를 첫-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

반응형