source

JavaScript에서 세트를 매핑/축소/필터링하는 방법

gigabyte 2022. 11. 19. 11:40
반응형

JavaScript에서 세트를 매핑/축소/필터링하는 방법

할 수 있는 방법이 없을까요?map/reduce/filter/etc aSet아니면 제가 직접 작성해야 하나요?

여기 센스 있는 게 있어Set.prototype확장 기능

Set.prototype.map = function map(f) {
  var newSet = new Set();
  for (var v of this.values()) newSet.add(f(v));
  return newSet;
};

Set.prototype.reduce = function(f,initial) {
  var result = initial;
  for (var v of this) result = f(result, v);
  return result;
};

Set.prototype.filter = function filter(f) {
  var newSet = new Set();
  for (var v of this) if(f(v)) newSet.add(v);
  return newSet;
};

Set.prototype.every = function every(f) {
  for (var v of this) if (!f(v)) return false;
  return true;
};

Set.prototype.some = function some(f) {
  for (var v of this) if (f(v)) return true;
  return false;
};

작은 세트를 하나 갖자.

let s = new Set([1,2,3,4]);

그리고 몇 가지 멍청한 기능들이

const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;

어떻게 동작하는지 확인하세요.

s.map(times10);    //=> Set {10,20,30,40}
s.reduce(add, 0);  //=> 10
s.filter(even);    //=> Set {2,4}
s.every(even);     //=> false
s.some(even);      //=> true

대단하지 않나요?그래, 나도 그렇게 생각해.그것을 추악한 반복기 사용법과 비교해 보십시오.

// puke
let newSet = new Set();
for (let v in s) {
  newSet.add(times10(v));
}

그리고.

// barf
let sum = 0;
for (let v in s) {
  sum = sum + v;
}

더 좋은 방법은 없을까?map그리고.reduce사용방법SetJavaScript에서?

간단한 방법은 ES6 확산 연산자를 통해 어레이로 변환하는 것입니다.

그러면 모든 어레이 기능을 사용할 수 있습니다.

const mySet = new Set([1,2,3,4]);
[...mySet].reduce(...);

코멘트를 바탕으로 논의를 요약하면 다음과 같습니다.다만, 이 코멘트를 작성하지 않아도 되는 기술적인 이유는 없습니다.reduce현재 제공되지 않고 있으며 ES7에서 변경되기를 바랄 뿐입니다.

에 대해서는map콜만 하면,Set그 존재는 논란의 여지가 있을 수 있습니다.

함수와의 매핑을 검토하다(a) => 42- 세트 사이즈가 1로 변경되며, 원하는 사이즈가 아닐 수도 있습니다.

예를 들어 어차피 접을 것이기 때문에 위반해도 괜찮다면,map전달하기 직전에 모든 원소를 떼어놓다reduce따라서 축소되는 중간 컬렉션(현시점에서는 세트가 아님)에 중복된 요소가 있을 수 있습니다.이는 기본적으로 처리를 위해 어레이로 변환하는 것과 동일합니다.

부족의 원인map/reduce/filterMap/Set컬렉션은 주로 개념적인 관심사인 것 같습니다.Javascript의 각 컬렉션 유형이 실제로 이것을 허용하기 위해 고유한 반복 메서드를 지정해야 하는지 여부

const mySet = new Set([1,2,3]);
const myMap = new Map([[1,1],[2,2],[3,3]]);

mySet.map(x => x + 1);
myMap.map(([k, x]) => [k, x + 1]);

대신

new Set(Array.from(mySet.values(), x => x + 1));
new Map(Array.from(myMap.entries(), ([k, x]) => [k, x + 1]));

대안으로 map/reduce/filter를 반복 가능/반복 프로토콜의 일부로 지정하는 것이 있습니다.entries/values/keys돌아가다Iterators. 그러나 모든 반복 가능한 것이 "매핑 가능"한 것은 아닙니다.또 다른 대안은 바로 이 목적을 위해 별도의 "수집 프로토콜"을 지정하는 것이었다.

그러나 ES에서 이 주제에 대해 현재 논의 중인 내용은 모릅니다.

const set = new Set([1,2,3,4,5]);

function filterSet(index) {
    set.delete([...set][index]);
}

filterSet(3); // Set { 1, 2, 3, 5, [size]: 4 }

세트장을 '조용히' 하기에는 꽤 괜찮은 해결책이라고 생각했습니다.

언급URL : https://stackoverflow.com/questions/33234666/how-to-map-reduce-filter-a-set-in-javascript

반응형