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
사용방법Set
JavaScript에서?
간단한 방법은 ES6 확산 연산자를 통해 어레이로 변환하는 것입니다.
그러면 모든 어레이 기능을 사용할 수 있습니다.
const mySet = new Set([1,2,3,4]);
[...mySet].reduce(...);
코멘트를 바탕으로 논의를 요약하면 다음과 같습니다.다만, 이 코멘트를 작성하지 않아도 되는 기술적인 이유는 없습니다.reduce
현재 제공되지 않고 있으며 ES7에서 변경되기를 바랄 뿐입니다.
에 대해서는map
콜만 하면,Set
그 존재는 논란의 여지가 있을 수 있습니다.
함수와의 매핑을 검토하다(a) => 42
- 세트 사이즈가 1로 변경되며, 원하는 사이즈가 아닐 수도 있습니다.
예를 들어 어차피 접을 것이기 때문에 위반해도 괜찮다면,map
전달하기 직전에 모든 원소를 떼어놓다reduce
따라서 축소되는 중간 컬렉션(현시점에서는 세트가 아님)에 중복된 요소가 있을 수 있습니다.이는 기본적으로 처리를 위해 어레이로 변환하는 것과 동일합니다.
부족의 원인map
/reduce
/filter
에Map
/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
돌아가다Iterator
s. 그러나 모든 반복 가능한 것이 "매핑 가능"한 것은 아닙니다.또 다른 대안은 바로 이 목적을 위해 별도의 "수집 프로토콜"을 지정하는 것이었다.
그러나 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
'source' 카테고리의 다른 글
명령줄을 사용하여 단일 테이블을 mysql 데이터베이스로 Import하는 방법 (0) | 2022.11.19 |
---|---|
두 개의 테이블(둘 다 자기 결합에서 파생됨)을 결합하여 세 번째 테이블을 만들려면 어떻게 해야 합니까? (0) | 2022.11.19 |
Google Finance API를 사용하여 주식 시세를 얻으려면 어떻게 해야 합니다. (0) | 2022.11.19 |
php가 비어있을 때 null입니까? (0) | 2022.11.19 |
Balley 및 HttpEntity를 사용하지 않는 POST 멀티파트 요구 작업 (0) | 2022.11.19 |