설정할 JavaScript 배열


145

MSDN은 JavaScript의 Set 컬렉션 추상화를 참조 합니다. .delete()이름으로 다양한 요소 를 제거 할 수 있도록 세트로 변환하고 싶은 객체 배열이 있습니다 .

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

이 배열을 세트로 어떻게 변환합니까? 더 구체적으로, 위의 배열을 반복하지 않고이 작업을 수행 할 수 있습니까? 문서가 상대적으로 부족합니다 (인스턴스화 된 세트에는 충분하지만 변환에는 적합하지 않은 경우).

키로 제거 하기 위해 Map 으로의 변환을 생각할 수도 있습니다 . 내가 달성하려는 것은 주로 색인을 사용하지 않고 키를 통해 요소에 액세스하여 액세스하거나 수정할 수있는 반복 가능한 컬렉션입니다.

배열에서 다른 배열로 변환하는 것이 궁극적 인 목표입니다.


1
평범한 낡은 물체처럼 들리 겠지만 ...
dandavis

3
@ 토마스 : 그래서 나는 배우고 싶은 무언가를 놓치고 있습니다. var s = new Set (), 객체 추가 및 s.delete (whatever) 발급과 var o = {1 : 'aaa', 2 : 'bbbb'...} 및 delete (o [ '1']) ?
Veverke

1
@Veverke는 당신이 처음 언급 한 것 (+1)보다 더 설명 적이었습니다. 감사합니다. 그러나 배열의 내용을 객체에 추가하고 키 액세스 가능한 구조와 같은 목록을 유지하기 위해 배열을 반복하지 않고도 그렇게 할 수 있습니까? 아이디어가있는 것 같습니다. 정교하게 시간을 내면 답변 형식으로 보는 것이 마음에 들지 않습니다.
Thomas

2
{"bob", "dole"}유효한 배열이 아니기 때문에 해당 배열 개체는 유효하지 않습니다.
Alnitak

1
@Veverke ES6 SetMap그 문제를 용납하지 않는 데이터 구조의 "순수"구현되어 Object일이 프로토 타입에 추가됩니다 캔을.
Alnitak

답변:


205

배열을 Set 생성자에 전달하십시오. Set 생성자는 iterable매개 변수를 허용합니다 . Array 객체는 iterable프로토콜을 구현 하므로 유효한 매개 변수입니다.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

여기를 보아라


OP의 데이터가 잘못되어서 그가 기대하는 바를 정확히 알지 못하기 때문에 스스로 답을 추가하는 것을 주저했지만 엄격하게 맞습니다.
Alnitak

10
IE11에서는 작동하지 않습니다. 이 생성자를 지원하지 않습니다. 사용자가 어떤 브라우저를 사용할지 모르면 피할 것입니다.
Eric

10

당신이 시작한다면 :

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

그리고 당신은 일련의 이름을 원합니다.

let namesSet = new Set(array.map(item => item.name));

3

어떤 레위 말했다 생성자로 전달에 대해 올바른지,하지만 당신은 또한 객체를 사용할 수 있습니다.

나는 무엇을 생각 Veverke가 말하려고하는 것은 쉽게 사용할 수 있다는 것입니다 delete키워드를 동일한 효과를 달성하기 위해 객체에.

나는 당신이 용어에 의해 혼란스러워 생각합니다; 속성 은 명명 된 인덱스로 사용할 수있는 개체의 구성 요소입니다 (그러한 방식으로 생각하려는 경우).

다음과 같이 해보십시오 :

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

그런 다음이 작업을 수행 할 수 있습니다.

delete obj["bob"];

그러면 객체의 구조는 다음과 같습니다.

{
    "mr.": "peabody",
    "darkwing": "duck"
}

같은 효과가 있습니다.


1
고마워 아스트로 :-). 실제로 이것은 "Set 객체와 일반 객체의 차이점은 무엇입니까?"라는 질문을 열었습니다. 위의 주석에서 언급했듯이 "Set"은 "clear"의 "기능성"을 제공하는 마무리 유형입니다.
Veverke

요컨대, 게시물 제목을 "자바 스크립트에서 Set 객체와 일반 객체의 차이점"으로 변경해야한다고 생각하고 "이것을 달성하려고하면 ... 차이점은 무엇입니까?
Veverke

@Veverke "Set 개체와 일반 개체의 차이점"은 문서를 읽을 수 있습니다 ..
Hacketo

1
@Hacketo : 당신은 API에서 "Clear"를 제공하는 Set 이외의 것을 찾으십니까?
Veverke

1
이것은 흥미로운 답변입니다.받은 것보다 더 많은 신용이 ​​필요하다고 생각합니다. 생각하게 했어요 감사합니다!
Thomas

2

정의 "세트는 각 값이 한 번만 발생할 수있는 값 모음입니다." 따라서 배열에 반복되는 값이 있으면 반복 된 값 중 하나의 값만 세트에 추가됩니다.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

따라서 배열에 반복되는 값이 있으면 set으로 변환하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.