var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;
(Firefox 제공하기는 매직 '속성' count 좋았지만, 주변 어딘가에 제거되었으면 버전 4.)
이렇게 하려면 믿지아니하며 es5 호환적 등 환경 , [노드입니다] (http://nodejs.org), 구글 크롬, 사파리, 파이어폭스, 또는 ie 9 4+ 5+:
Object.keys(obj).length
이 코드를 사용할 수 있습니다.
if (!Object.keys) {
Object.keys = function (obj) {
var keys = [],
k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
이 뿐만 아니라 그 이전 브라우저를 사용하면 됩니다.
var len = Object.keys(obj).length;
[언더스코엘가이스] 사용하는 경우 (http://underscorejs.org/) 를 사용할 수 있습니다 ([.size] http://underscorejs.org/ # 크기) (감사합니다 @douwe): '.size (목표)'
[.Keys] 또는 사용할 수도 있습니다 (http://underscorejs.org/ # 키) 이보다 더 확연히 보여줄 수 있는 일부: '.keys 트렌크스' (목표)
내가 밑줄, 그 팽팽한 라이브러리란 수행하기 위한 기본 전지전능하심이라 많은 것을 권장합니다 일치할 수 있으며 가능하면 ECMA5 지연합니다 넷윈을 구축상의.
그렇지 않으면 내가 지원부에서는 @Avi& # 39 의 그 답이 있다. 내가 편집할 수 있는 링크를 추가할 수 있습니다 () 메서드를 포함하는 MDC doc 시동키는 비사양 ecma5 추가할 수 있는 브라우저.
표준 객체에는 구축상의 ([ES5.1 객체에는 내부 속성 및 메서드] [1]) '객체' 를 해당 번호를 사용하지 않은 추적되도록 키 / 속성 때문에 표준 크기를 확인할 수 있는 방법을 있어서는 안된다 '객체' 명시적 또는 암시적으로 반복 없이 그 동안 키.
여기에서 가장 흔히 사용되는 대안.
<! - 모든 언어: js - >.
, 반복 내부적으로 '작품' 로비치스키스 (목표) 트렌크스 임시 어레이입니다 되돌려줍니다 시동키는 통해 계산할 수 있고 그 길이.
다른 많은 라이브러리 기반 참조용이므로 이 항목에서 매우 유용합니다 맥락에서 라이브러리란. 그러나 성능 측면에서 에서 완벽한 아니 라이브러리 없다 비해 얻는 방법 중 하나를 for 루프는 로비치스키스 es5 '또는' 이후 사실상 모든 이들을 캡슐화됨 코드 라이브러리 (기본 또는 시메드).
그렇지 않으면 할 수 있는 최적화된 코드를 만들어 아주 약간 'k' 를 사용하여 로컬 (var 'k') 와 접두어입니다 증분식 작동자 ('++count') 대신 후위.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
이 아이디어를 캐싱과는 해스운프로페티 '의존' 다른 방법:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
이는 주어진 환경에 대한 신속한 방관하겠나 여부에 대한 문제가 벤치마킹. 아무튼 매우 제한된 성능 향상을 기대할 수 있다.
[1]: # sec-8.6.2 http://www.ecma-international.org/ecma-262/5.1/
실제로 실행하는 경우 성능 문제를 붙여넣습니다 랩할 제안하세요 하면 꼭 이래야겠어요 추가/제거 특성는 있는 오브젝트 간 기능을 제공하는 것이 / 감소 또한 증분을 적절하게 release. (크기?) 재산이잖아
초기 속성 수를 계산하는 됩니다) 에서 한 번 및 이동 할 수 있다. # 39, t # 39, 실제 성능 문제를 협업공간이 isn& don& 수는 없는 노릇. 그냥 있는 랩 (wrap) 의 코드 (object) '와' 제너움베로프프로페르티스 약어입니다 기능을 수행할 수 있는 것이 특징이다.
하지만 어떤 방식으로든 i& # 39 m, 이를 모르고 계속 이터레이션에 count '와' 의 실존 대한 확인 할 수 있습니다 최소한으로 줄이는 경우, t # 39 doesn& 반복할 수 있는 객체 및 정의하십시오 타임코드가 (ie 아닌 Firefox) 그럼 나중에 사용 예:
if (myobj.__count__ === undefined) {
myobj.__count__ = ...
}
이 방법을 사용하는 것이다 ',' 모든 지원하는 브라우저로 count 및 이터레이션에 이벤트여야만 수행되, t # 39 의 don& 하는 것이다. # 39, 이렇게 할 경우 카운트입니다 변경사항과 너회가 can& t make it a 함수은 항상 수 있습니다.
if (myobj.__count__ === undefined) {
myobj.__count__ = function() { return ... }
myobj.__count__.toString = function() { return this(); }
}
This way '의 기능은 count 때마다 참조입니다 미로비.' 화재 및 재계산할.
아마 < 명시된 대로, Avi, https://stackoverflow.com/a/4889658/1047014>
Object.keys(obj).length
이 모든 것이 아니라 열거 할 수 있는 속성 속성 또한 따라 객체에는 비사양 열거 포함시키십시오 오브ject.게타운프로페르티나미스 사용합니다를 '대신'. Here& # 39 의 차이.
var myObject = new Object();
Object.defineProperty(myObject, "nonEnumerableProp", {
enumerable: false
});
Object.defineProperty(myObject, "enumerableProp", {
enumerable: true
});
console.log(Object.getOwnPropertyNames(myObject).length); //outputs 2
console.log(Object.keys(myObject).length); //outputs 1
console.log(myObject.hasOwnProperty("nonEnumerableProp")); //outputs true
console.log(myObject.hasOwnProperty("enumerableProp")); //outputs true
console.log("nonEnumerableProp" in myObject); //outputs true
console.log("enumerableProp" in myObject); //outputs true
언급된 바와 같이 [here] (http://kangax.github.com/es5-compat-table/) 이 있다 '는' 로비치스키스 같은 브라우저 지원
그러나 대부분의 경우 원치 않는 포함하도록 농너메라블레스 이런 유형의 운영체 it& 잘 알고 있지만, 항상 # 39 의 차이;)
대한 (목표) 는 객체에 대한 올바른 트렌크스 로비치스키스 오토메이티드 Avi 아마 반복할 수 있는 기능을 않는 제약됨 정보기술 (it)
예:
obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2
대對
arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
_.each(obj, function(a){
arr.push(a);
});
};
Object.keys(obj).length; // should be 3 because it looks like this
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */
이를 방지하기 위한 단계를.
동일팔레트에 기능이 없는 개체에서 보기할 수를 키도
새 객체를 사용할 수 있도록 별도의 객체인지 또는 특별히 함수 (매핑하려는 경우 카운트입니다 몇 가지 기능을 사용하여 파일의 트렌크스 로비치스키스 (목표) '')
그래 내가 내) 에서 사용한 또한 _을 또는 밑줄 모듈에서는 노데지스 (예:
물론 해당 소스 문서 및 기타 다양한 정보 깃허브 (http://underscorejs.org/) 에서 볼 수 있습니다.
그리고 마지막으로 로다시 구축상의 https://lodash.com/docs # 크기
'_.size (목표)'
출처: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
>. 오브ject.데페인프로페티 (obj, 제안 설명자)
당신의 모든 객체에는 추가할 수 있습니다.
Object.defineProperty(Object.prototype, "length", {
enumerable: false,
get: function() {
return Object.keys(this).length;
}
});
또는 단일 개체:
var myObj = {};
Object.defineProperty(myObj, "length", {
enumerable: false,
get: function() {
return Object.keys(this).length;
}
});
예:
var myObj = {};
myObj.name = "John Doe";
myObj.email = "[email protected]";
myObj.length; //output: 2
for(var i in myObj) {
console.log(i + ":" + myObj[i]);
}
출력:
name:John Doe
email:[email protected]
참고: < 작업하십시오 않는다. IE9 브라우저.
function BasicList()
{
var items = {};
this.count = 0;
this.add = function(index, item)
{
items[index] = item;
this.count++;
}
this.remove = function (index)
{
delete items[index];
this.count--;
}
this.get = function(index)
{
if (undefined === index)
return items;
else
return items[index];
}
}
OP didn& 여부를 지정합니다 # 39 는 그런 경우, t 객체에는 메서드를 사용하여 nodeList 됩니다 길이 바로. 예:
buttons = document.querySelectorAll('[id=button)) {
console.log('Found ' + buttons.length + ' on the screen');
다음은 성능 테스트를 위한 세 가지 방법.
https://jsperf.com/get-the-number-of-keys-in-an-object
20,735 operations per second)
매우 단순하고 호환적. 런입니다 빠르게 얻을 수 있는 새로운 어레이입니다 but 비싸다구요 tcpg 키 때문에 그런 던져진다.
"' 로비치스키스 반품하십시오 트렌크스 (오브제크토레이드). "'
15,734 operations per second)
"' 이제 크기 = 0; 대한 (let k 의 오브제크토레이드) { size++ } 크기, 반품하십시오. "'
조금 더 나은 메모리 사용량, 그래서 아마 you& # 39 곳 근처에 느려지지만, re 모바일 또는 다른 작은 머신뿐만 최적화하면 관심이 있는 경우
953,839,338 operations per second)
"' 마프토레이드리시즈 반품하십시오. "'
나는 모든 객체에는 사용할 수 있도록 시도하시겠습니까 다음과 같습니다.
Object.defineProperty(Object.prototype, "length", {
get() {
if (!Object.keys) {
Object.keys = function (obj) {
var keys = [],k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
return Object.keys(this).length;
},});
console.log({"Name":"Joe","Age":26}.length) //returns 2