설정할 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 Set및 Map그 문제를 용납하지 않는 데이터 구조의 "순수"구현되어 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.