답변:
최신 브라우저 (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +)에서는 내장 Object.keys 메소드를 사용할 수 있습니다 .
var keys = Object.keys(myObject);
위는 완전한 폴리 필을 가지고 있지만 단순화 된 버전은 다음과 같습니다.
var getKeys = function(obj){
var keys = [];
for(var key in obj){
keys.push(key);
}
return keys;
}
또는로 교체 var getKeys
하여 객체 Object.prototype.keys
를 호출 할 수 있습니다 .keys()
. 프로토 타입을 확장하면 부작용이 생길 수 있으므로 권장하지 않습니다.
for (var key in myObject) {...}
기술은 브라우저 및 V8 외부의 자바 스크립트 런타임에 유용합니다. 예를 들어, 자바 스크립트 map-reduce 쿼리를 Riak에 전달할 때 Object
객체가 존재하지 않으므로 Object.keys
메서드를 사용할 수 없습니다.
Object.keys
메서드는 객체의 자체 속성 만 반환합니다. 나는 그것을 중요한 구별로 본다.
으로 slashnick는 지적, 당신은 그 속성 이름에 대한 개체를 반복하는 구조 "에 대한"를 사용할 수 있습니다. 그러나 객체의 프로토 타입 체인에서 모든 속성 이름을 반복하게됩니다. 객체 자체의 속성에 대해서만 반복 하려면 Object # hasOwnProperty () 메서드를 사용할 수 있습니다 . 따라서 다음과 같은 것이 있습니다.
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
/* useful code here */
}
}
esc
객체에 약 백만 개의 속성이 있었으며 대부분 사용하지 않았기 때문에 키를 누르고 15 분을 보냈 습니다. 경고가있었습니다.
Sam Dutton이 대답하자마자이 목적을위한 새로운 방법이 ECMAScript 5th Edition에 도입되었습니다. Firefox 4 , Chrome 6, Safari 5 및 IE 9Object.keys()
에서 원하는 작업을 수행합니다 .
메소드를 지원하지 않는 브라우저에서 메소드를 매우 쉽게 구현할 수도 있습니다. 그러나 일부 구현은 Internet Explorer와 완전히 호환되지 않습니다. 보다 호환 가능한 솔루션은 다음과 같습니다.
Object.keys = Object.keys || (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
DontEnums = [
'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
],
DontEnumsLength = DontEnums.length;
return function (o) {
if (typeof o != "object" && typeof o != "function" || o === null)
throw new TypeError("Object.keys called on a non-object");
var result = [];
for (var name in o) {
if (hasOwnProperty.call(o, name))
result.push(name);
}
if (hasDontEnumBug) {
for (var i = 0; i < DontEnumsLength; i++) {
if (hasOwnProperty.call(o, DontEnums[i]))
result.push(DontEnums[i]);
}
}
return result;
};
})();
현재 허용되는 답변에는 hasOwnProperty ()에 대한 검사가 포함되어 있지 않으며 프로토 타입 체인을 통해 상속 된 속성을 반환합니다. 또한 프로토 타입 체인에서 열거 할 수없는 속성으로 인해 같은 이름을 가진 로컬로 선언 된 속성이 DontEnum 속성을 상속하는 Internet Explorer의 유명한 DontEnum 버그를 설명하지 않습니다.
Object.keys () 를 구현 하면 보다 강력한 솔루션을 얻을 수 있습니다.
편집 : 프로토 타입에 잘 알려진 kangax 와의 최근 토론에 이어 , 여기 에있는 그의 Object.forIn()
기능 코드를 기반으로 DontEnum 버그에 대한 해결 방법을 구현했습니다 .
Object.prototype
. 그러나 짧은 코드가 더 크고 강력한 코드보다 훨씬 매력적으로 보이는 경우가 종종 있지만,이 답변의 핵심은 Object.keys()
이 코드를 지원하지 않는 브라우저에서 구현할 수있는 ECMAScript 5를 사용 하는 것입니다. 기본 버전은 이보다 훨씬 성능이 좋습니다.
Object.keys
해당하는 문자열 배열 만 반환 합니다. 이는 기본 (사용자 정의) 객체로 작업 할 때 중요하지 않지만 호스트 객체에서는 눈에 잘 띄어 야합니다 (지정되지 않은 호스트 객체 동작은 별도의 고통스러운 이야기이지만). ALL을 통해 열거 할 속성 (비 열거 포함), ES5는 제공 (. - 내의 compat 테이블에 지원을 참조 kangax.github.com/es5-compat-table )Object.getOwnPropertyNames
Object.keys(stuff)
되지 않았 는지 설명 할 수 있습니까 stuff.keys()
?
Object.keys 및 기타 ECMAScript 5 방법은 Firefox 4, Chrome 6, Safari 5, IE 9 이상에서 지원됩니다.
예를 들면 다음과 같습니다.
var o = {"foo": 1, "bar": 2};
alert(Object.keys(o));
ECMAScript 5 호환성 표 : http://kangax.github.com/es5-compat-table/
새로운 방법에 대한 설명 : http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
Object.getOwnPropertyNames(obj)
이 함수는로 표시되는 속성 외에 열거 할 수없는 속성도 표시합니다 Object.keys(obj)
.
JS에서 모든 속성에는 boolean을 포함하여 몇 가지 속성이 enumerable
있습니다.
일반적으로 열거 할 수없는 속성은 "내부"이고 덜 자주 사용되지만 실제 상황을 확인하기 위해 가끔 살펴 보는 것이 통찰력이 있습니다.
예:
var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})
console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]
console.log(Object.keys(o))
// [ 'yes' ]
for (var x in o)
console.log(x)
// yes, base
또한 방법에 유의하십시오.
Object.getOwnPropertyNames
그리고 Object.keys
하지 않습니다 찾기 위해 프로토 타입 체인을 이동base
for in
않습니다프로토 타입 체인에 대한 자세한 내용은 여기 ( https://stackoverflow.com/a/23877420/895245)
나는 덤프 기능을 좋아합니다.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
https://j11y.io/demos/prettyprint/
?
이것은 IE8에서도 대부분의 브라우저에서 작동하며 어떤 종류의 라이브러리도 필요하지 않습니다. var i는 당신의 열쇠입니다.
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);
Mozilla는 지원되지 않는 브라우저에서 지원하는 방법에 대한 자세한 구현 세부 정보 를 제공합니다.
if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function (obj) {
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {
if (hasOwnProperty.call(obj, prop)) result.push(prop);
}
if (hasDontEnumBug) {
for (var i=0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
}
}
return result;
};
})();
}
원하는대로 포함시킬 수도 있지만 extensions.js
스크립트 스택 맨 위에 있는 일종의 파일에 포함시킬 수도 있습니다 .
IE는 기본 속성에 대해 (i에서 obj)를 지원하지 않습니다. 내가 찾을 수있는 모든 소품의 목록입니다.
stackoverflow가 바보 같은 필터링을 수행하는 것 같습니다.
목록은이 Google 그룹 게시물의 맨 아래에 있습니다 .- https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
내가 사용하기 때문에 underscore.js을 거의 모든 프로젝트에, 내가 사용하는 것이 keys
기능 :
var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));
그 결과는 다음과 같습니다.
['name', 'hello']
이 솔루션은 내 경우와 크로스 브라우저에서 작동합니다.
var getKeys = function(obj) {
var type = typeof obj;
var isObjectType = type === 'function' || type === 'object' || !!obj;
// 1
if(isObjectType) {
return Object.keys(obj);
}
// 2
var keys = [];
for(var i in obj) {
if(obj.hasOwnProperty(i)) {
keys.push(i)
}
}
if(keys.length) {
return keys;
}
// 3 - bug for ie9 <
var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
if(hasEnumbug) {
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
var nonEnumIdx = nonEnumerableProps.length;
while (nonEnumIdx--) {
var prop = nonEnumerableProps[nonEnumIdx];
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
keys.push(prop);
}
}
}
return keys;
};
_.keys(myJSONObject)