ES6 Itable을 배열로 변환
예를 들어 배열과 같은 자바스크립트 ES6가 있다고 하자 미리 알고 있는 Itable은 길이가 유한할 것입니다. 그것을 자바스크립트 배열로 변환하는 가장 좋은 방법은 무엇입니까?
이렇게 하는 이유는 언더스코어나 로다시와 같은 많은 js 라이브러리가 Array만을 지원하기 때문에 Itable에서 해당 함수를 사용하려면 먼저 Array로 변환해야 합니다.
python에서는 그냥 list() 함수를 사용하면 됩니다.ES6에 이와 동등한 것이 있습니까?
Array.from을 사용하거나 구문(...)을 확산할 수 있습니다.
예:
const x = new Set([ 1, 2, 3, 4 ]);
const y = Array.from(x);
console.log(y); // = [ 1, 2, 3, 4 ]
const z = [ ...x ];
console.log(z); // = [ 1, 2, 3, 4 ]
요약:.
Array.from()함수, 입력에서와 같이 반복 가능한 수를 사용하고 반복 가능한 수의 배열을 반환합니다.- 구문 펼치기:
...배열 리터럴과 함께 사용할 수 있습니다.
const map = new Map([[ 1, 'one' ],[ 2, 'two' ]]);
const newArr1 = [ ...map ]; // create an Array literal and use the spread syntax on it
const newArr2 = Array.from( map ); //
console.log(newArr1, newArr2);
배열을 복사할 때 주의해야 할 사항:
위의 방법을 통해 배열을 복사할 때는 얕은 복사본만 생성된다는 사실에 유의해야 합니다.이 예를 통해 잠재적인 문제를 명확히 알 수 있습니다.
let arr = [1, 2, ['a', 'b']];
let newArr = [ ...arr ];
console.log(newArr);
arr[2][0] = 'change';
console.log(newArr);
중첩 배열 때문에 여기서는 참조가 복사되고 새 배열이 생성되지 않습니다.따라서 이전 배열의 내부 배열을 변형하면 이 변경 사항이 새 배열에 반영됩니다(같은 배열을 참조하므로 참조가 복사되었습니다).
주의해야 할 해결책:
다음을 사용하여 어레이의 딥 클론을 생성하면 복사본이 얕아지는 문제를 해결할 수 있습니다.JSON.parse(JSON.stringify(array)). 예를 들어,
let arr = [1, 2, ['a', 'b']]
let newArr = Array.from(arr);
let deepCloneArr = JSON.parse(JSON.stringify(arr));
arr[2][0] = 'change';
console.log(newArr, deepCloneArr)
Array.from 메서드를 사용할 수 있습니다. 이 메서드는 ES6에서 추가되고 있지만 맵 및 집합과 같은 배열 및 반복 가능한 개체만 지원합니다(ES6에서도 제공됨).일반 개체의 경우 언더스코어의 toArray 메서드 또는 lodash의 toArray 메서드를 사용할 수 있습니다. 두 라이브러리 모두 실제로는 배열뿐만 아니라 개체에 대한 지원도 크기 때문입니다.이미 언더스코어나 로대시를 사용하고 있다면 다행히도 객체에 대한 맵이나 축소와 같은 다양한 기능적 개념을 추가하여 문제를 해결할 수 있습니다.
맵에 대해 다음 접근 방식을 테스트합니다.
const MyMap = new Map([
['a', 1],
['b', 2],
['c', 3]
]);
const MyArray = [...MyMap].map(item => {
return {[item[0]]: item[1]}
});
console.info( MyArray ); //[{"a", 1}, {"b", 2}, {"c": 3}]
다음을 수행할 수도 있지만 두 가지 접근 방식 모두 권장할 수는 없습니다(단지 완전성 개념 증명).
let arr = [];
for (let elem of gen(...)){
arr.push(elem);
}
또는 ES5 + 제너레이터 기능을 사용한 "하드웨이"(Fiddle은 현재 Firefox에서 작동):
var squares = function* (n) {
for (var i = 0; i < n; i++) {
yield i * i;
}
};
var arr = [];
var gen = squares(10);
var g;
while (true) {
g = gen.next();
if (g.done) {
break;
}
arr.push(g.value);
}
언급URL : https://stackoverflow.com/questions/27612713/convert-es6-iterable-to-array
'programing' 카테고리의 다른 글
| 전처리기를 이용한 문자열 연결 (0) | 2023.10.01 |
|---|---|
| 호스트 시스템에서 도커 이미지는 어디에 저장됩니까? (0) | 2023.10.01 |
| .cnf에서 sql_mode를 변경해도 @@sql_mode가 변경되지 않는 MariaDB 10.5의 이유는 무엇입니까? (0) | 2023.10.01 |
| 셰프 ruby_block ShellOut mysql 결과 stdout 영원히 비어 있습니다. (0) | 2023.10.01 |
| Wordpress - Uncatched TypeError: wp.media가 함수가 아닙니다. (0) | 2023.10.01 |