연관 배열 키 목록 얻기


258

Javascript에 연관 배열이 있습니다.

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

이 사전의 키를 어떻게 얻습니까? 즉 나는 원한다

var keys = ["cats", "dogs"];

7 년 후 편집 : 용어를 올바르게 얻으려면 Javascript에는 'associative array'와 같은 것이 없습니다. 기술적으로는 이것이 object우리가 원하는 객체 키입니다.


lodash JS를 사용한 간단한 방법 -lodash.com/docs#keys
화학 프로그래머

용어를 명확히 해주셔서 감사합니다! 밝은 빨간색으로 깜박이는 조명에서 조금 더 크게 만들 수 있습니까?
Joe Phillips

@Joe 기회가된다면 Google에서 첫 번째 결과를 드리겠습니다
Simon_Weaver

답변:


84

당신이 사용할 수있는: Object.keys(obj)

예:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

브라우저 지원에 대해서는 아래 참조를 참조하십시오. Firefox 4.20, Chrome 5, IE9에서 지원됩니다. 아래 링크에는 Object.keys()브라우저에서 지원되지 않는 경우 추가 할 수있는 코드 스 니펫이 포함되어 있습니다 .

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


나는 이것을 지금 받아 들여진 대답으로 바꾸고 있습니다. IE8만이 더 이상 지원하지 않습니다 (polyfill을 사용할 수있는 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver

382

이 시도:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnProperty의 프로토 타입 객체에 키를 삽입 할 수 있기 때문에 필요합니다 dictionary. 그러나 일반적으로 이러한 키를 목록에 포함시키지 않으려 고합니다.

예를 들어, 이렇게하면 :

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

다음 수행 for...in을 통해 루프를 dictionary당신은 얻을 것이다, a그리고 b,하지만 당신은 얻을 것이다 c.


루프 후에 사용해야하는 경우가 아니면 "var keys = []"를 선언 할 필요가 없습니다.
mzalazar

2
@mzalazar, 더 잘하거나 전역 변수가 될 수 있습니다.
b00t

@ b00t 비록 for 루프 안에 변수를 선언함으로써 ... 그것은 전역 공간에 설정되지 않을 것입니다 ... 이제 당신은 저를 의심하게 만들었습니다 :)
mzalazar

2
@mzalazar,하지만을 사용하는 경우 언제든지 선언하지 않습니다 ( ) keys.push(key);. 전역 네임 스페이스에서 가져 와서 선언합니다. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

그것은이다 for..in을 문 .


1
"dogs"와 위의 배열 사이에 쉼표 대신 콜론이 있어야합니다. 그것이 전사 때문이라고 가정하십시오.
wombleton

68
dictionary.hasOwnProperty(key)그렇지 않으면 확인하는 것이 매우 중요 합니다. 프로토 타입 체인의 방법으로 끝날 수 있습니다.
Tigraine

4
같은 기사에서 : 임의의 순서로 객체의 열거 가능한 속성을 반복합니다 . 키 순서가 중요한 경우 배열에서 키를 푸시하고 정렬 한 다음 for () 루프를 사용하여 정렬 된 배열에서 원래 객체를 인덱싱 할 키를 가져 오는 등의 작업을 수행해야합니다.
mcmlxxxvi

1
물론 객체에 프로토 타입이 없다고 확신 할 수있는 경우 dictionary.hasOwnProperty 검사를 생략하여 최적화하는 것이 공정합니다. 그러나 JavaScript 사전은 실제로 객체이므로이 컨텍스트에서 프로토 타입 상속 가능성을 알고 있어야합니다.
fixermark

16

라이브러리 (jQuery, 프로토 타입 등)를 사용하는 경우 for..in 사용에주의하십시오. 대부분은 생성 된 객체 (사전 포함)에 메소드를 추가하기 때문입니다.

이것은 당신이 그것들을 반복 할 때 메소드 이름이 키로 나타남을 의미합니다. 라이브러리를 사용하는 경우 설명서를보고 열거 가능한 섹션을 찾으십시오. 여기에서 객체를 반복하는 올바른 방법을 찾을 수 있습니다.


3

간단한 JQUERY 방식.

이것이 내가 사용
하려는 자바 스크립트 사전 객체 인 DictionaryObj를 사용 하는 것입니다. 가치, 핵심은 물론 사전에 그것들의 이름입니다.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
:-)이 jQuery를 (미세 인)이 필요하지만 당신은 그것을 언급하는 것을 잊었다
Simon_Weaver

@Exzile 함수 정의의 인수 이름은 매우 혼동됩니다. 그것은에서 말했다 api.jquery.com/jquery.each 콜백 함수 (문자열 propertyName 형식 개체 valueOfProperty) 인 것을. 당신의 이름은 그 반대를 암시합니다.
Chris

@Chris 나는 당신을 위해 그것을 업데이트 할 것입니다. 지적 해 주셔서 감사합니다.
Exzile

0

저는 현재 Rob de la Cruz의 답변을 사용하고 있습니다

Object.keys(obj)

그리고 일찍로드 된 파일 에는 Object.keys가 내장되어 있지 않은 이전 버전의 스크립트 인터프리터의 경우를 포괄하는 인터넷의 다른 곳에서 빌린 코드 가 있습니다.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

나는 이것이 현대의 간단한 코드와 이전 버전의 브라우저에 대한 이전 버전과 호환되는 지원 등 대규모 프로젝트에서 두 가지 모두에서 최고라고 생각합니다.

Rob de la Cruz의 Object.keys (obj)를 기본적으로 사용할 수없는 경우 JW의 솔루션을 효과적으로 함수에 넣습니다.

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