문제

나는 자바 스크립트 객체가 해시라는 것을 알고 있지만 키를 가져오는 내장 함수를 찾을 수 없습니다.

var h = {a:'b',c:'d'};

나는 다음과 같은 것을 원한다

var k = h.keys() ; // k = ['a','c'];

항목을 반복하고 내가 반환하는 배열에 키를 추가하는 함수를 직접 작성하는 것은 간단합니다. 하지만 이를 수행하는 표준적이고 깔끔한 방법이 있습니까?

제가 놓친 간단한 내장 기능임에 틀림없다고 계속 생각하는데 찾을 수 없습니다!

도움이 되었습니까?

해결책

최신 JavaScript(ECMAScript 5)에는 다음과 같은 함수가 있습니다. Object.keys 이 작업을 수행합니다:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

호환성 세부정보를 확인할 수 있습니다. 여기.

모질라 사이트 이전 버전과의 호환성을 위한 스니펫도 있습니다.

if(!Object.keys) Object.keys = function(o){
   if (o !== Object(o))
      throw new TypeError('Object.keys called on non-object');
   var ret=[],p;
   for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
   return ret;
}

다른 팁

클라이언트 브라우저와의 대규모 호환성이 필요한 프로덕션 코드의 경우 위의 Ivan Nevostruev의 답변을 shim과 함께 제안합니다. Object.keys 오래된 브라우저에서는.그러나 ECMA의 새로운 기능을 사용하면 요청된 정확한 기능을 얻을 수 있습니다. defineProperty 특징.

ECMAScript 5부터 - Object.defineProperty

ECMA5부터는 다음을 사용할 수 있습니다. Object.defineProperty() 열거할 수 없는 속성을 정의합니다.그만큼 현재 호환성 아직 부족한 부분이 많지만 결국에는 모든 브라우저에서 사용할 수 있게 될 것입니다.(특히 현재 IE8과의 비호환성에 주목하세요!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

하지만 ECMA5가 이미 추가되었기 때문에 Object.keys 다음을 사용할 수도 있습니다.

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

원래 답변

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

편집하다: 이 답변은 한동안 사용되었으므로 위의 내용은 그대로 두겠습니다.이 글을 읽는 사람은 아래 Ivan Nevostruev의 답변도 읽어야 합니다.

프로토타입 함수를 열거 불가능하게 만드는 방법은 없습니다. 이로 인해 항상 사용하지 않는 for-in 루프에서 나타나게 됩니다. hasOwnProperty.나는 여전히 Object의 프로토타입을 확장하는 것이 그렇게 지저분하지 않다면 이 답변이 이상적이라고 생각합니다.

당신이 사용할 수있는 Object.keys

Object.keys(h)

당신은 사용할 수 있습니다 Underscore.js, 이는 Javascript 유틸리티 라이브러리입니다.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]

내가 아는 한, 이것이 당신이 할 수 있는 최선의 방법입니다...

var keys = [];
for (var k in h)keys.push(k);

사용하여 jQuery 다음과 같이 열쇠를 얻을 수 있습니다.

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

또는:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

@pimlottc 덕분에

for/in을 사용하여 객체의 속성을 반복할 수 있다고 생각하므로 다음과 같이 할 수 있습니다.

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

위의 최고 평점 답변을 사용하고 싶었습니다.

Object.prototype.keys = function () ...

그러나 Google 지도 API v3과 함께 사용하면 Google 지도가 작동하지 않습니다.

for (var key in h) ...

잘 작동합니다.

요소만 가져오고 함수는 가져오지 않으려는 경우 이 코드가 도움이 될 수 있습니다.

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

이것은 HashMap 구현의 일부이며 키만 필요합니다. this 키를 포함하는 해시맵 객체입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top