나는 자바 스크립트 객체에서 해시로 두 배를 알고 있지만 키를 얻는 내장 함수를 찾을 수 없었습니다.
var h = {a:'b',c:'d'};
나는 같은 것을 원한다
var k = h.keys() ; // k = ['a','c'];
항목을 반복하고 반환하는 배열에 키를 추가하는 함수를 직접 작성하는 것이 간단하지만 표준 깔끔한 방법이 있습니까?
나는 그것이 놓친 간단한 내장 기능이어야한다고 생각하지만 그것을 찾을 수 없습니다!
나는 자바 스크립트 객체에서 해시로 두 배를 알고 있지만 키를 얻는 내장 함수를 찾을 수 없었습니다.
var h = {a:'b',c:'d'};
나는 같은 것을 원한다
var k = h.keys() ; // k = ['a','c'];
항목을 반복하고 반환하는 배열에 키를 추가하는 함수를 직접 작성하는 것이 간단하지만 표준 깔끔한 방법이 있습니까?
나는 그것이 놓친 간단한 내장 기능이어야한다고 생각하지만 그것을 찾을 수 없습니다!
답변:
Object.keys
이 작업을 수행하는 최신 JavaScript (ECMAScript 5) 기능 이 있습니다.
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;
}
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
것 keys
때문에 모든 개체, 개체의 모든 하위 클래스에 사용할 수 있습니다. OOP를 사용하려고 할 때 아마도 원할 것입니다. 어쨌든 이것은 실제로 요구 사항에 달려 있습니다.
클라이언트 브라우저와의 큰 호환성을 요구하는 프로덕션 코드의 경우 여전히 Object.keys
구형 브라우저에서 shim으로 Ivan Nevostruev의 대답을 제안 합니다. 그러나 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의 프로토 타입을 확장하는 것이 그렇게 복잡하지 않은 경우에도 여전히이 답변이 이상적이라고 생각합니다.
Javascript 유틸리티 라이브러리 인 Underscore.js를 사용할 수 있습니다 .
_.keys({one : 1, two : 2, three : 3});
// => ["one", "two", "three"]
Object.prototype
_.keys(obj).length
키가 있는지 확인하십시오.
내가 아는 한 이것은 당신이 할 수있는 최선입니다 ...
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 덕분에
JQuery.map
. $.map(h, function(v,k) { return k; });