자바 스크립트 개체의 요소 수


103

자바 스크립트 객체의 요소 수를 (어딘가에서) 얻는 방법이 있습니까 ?? (즉, 일정 시간 복잡성).

해당 정보를 검색하는 속성이나 메서드를 찾을 수 없습니다. 지금까지는 전체 컬렉션을 반복하는 것만 생각할 수 있었지만 그것은 선형 시간입니다.
물체의 크기에 직접 접근 할 수 없다는 것이 이상합니다.

편집 :
나는 Object객체 (일반적으로 객체가 아님) 에 대해 이야기하고 있습니다 .

var obj = new Object ;

5
이미 여기에 대답 stackoverflow.com/questions/126100/... Object.keys (OBJ) .length
스팻

답변:


155

JS 구현은 이러한 값을 내부적으로 추적 할 수 있지만이를 얻을 수있는 표준 방법은 없습니다.

과거에 Mozilla의 Javascript 변형은 비표준을__count__ 노출 했지만 버전 1.8.5에서 제거되었습니다.

브라우저 간 스크립팅의 경우 속성을 명시 적으로 반복하고 확인해야합니다 hasOwnProperty().

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

ECMAScript 5 가능 구현의 경우 (Kudos to Avi Flax ) 로 작성할 수도 있습니다.

function countProperties(obj) {
    return Object.keys(obj).length;
}

열거 할 수없는 속성 (예 : 배열의 length) 도 놓칠 수 있습니다 .

jQuery, Prototype, Mootools, $ whatever-the-newest-hype와 같은 프레임 워크를 사용하는 경우 고유 한 컬렉션 API와 함께 제공되는지 확인하세요. 이는 네이티브 JS 객체를 사용하는 것보다 문제에 대한 더 나은 솔루션 일 수 있습니다.


11
젠장 난 항상 hasOwnProperty를 잊어 버려. .NET 땅에서 너무 많은 시간을 보내겠습니다. +1
annakata 2009-06-05

2
jQuery는 쿼리에서 가져온 컬렉션에 대해 객체를 사용하고 길이 속성으로 해당 값을 노출합니다.
Nosredna

6
Firefox4 __count__가 사라졌습니다 :(
Timo

1
for in없이 이것을 할 수있는 방법이 있습니까? 나는 같은 유형의 바인드에 있지만 가능한 한 JSLint를 전달하고 싶습니다.
가로등

1
왜 우리는 필요 hasOwnProperty()합니까?
스위스

99

ES5 호환 환경에서이를 수행하려면

Object.keys(obj).length

(브라우저 지원 여기 )
(Object.keys에 문서 여기가 당신이 비 ECMA5 브라우저에 추가 할 수있는 포함 방법)


2
이것은이 답변에 대한 올바른 질문이 아닙니다. 이를 통해 객체의 모든 키를 가져와 새로 만든 배열에 넣은 다음 새 배열에서 length 속성을 검색합니다.
GetFree

11
프로그래밍 방식으로 가장 효율적이지는 않지만 개발자에게는 가장 효율적입니다.
superluminary

9

빌드에서 이미 jQuery를 사용하고 있다면 다음을 수행하십시오.

$(yourObject).length

객체에 대해 잘 작동하며 이미 jQuery를 종속성으로 사용했습니다.


5
이상해 ... 이건 나 한테는 안돼. 나는 항상 1을 얻습니다. ZelkiN의 대답은 저에게 효과적입니다.
마이크는 설치류

3
이 코드는 항상 1을 반환합니다. 단 하나의 개체입니다. 그것은의 요소를 계산하지 않습니다
BeRocket

5
function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

2

AFAIK, 어레이로 전환하지 않는 한이 작업을 안정적으로 수행 할 수있는 방법이 없습니다. 어떤 정직 하지 않습니다 이상 것 같습니다. 배열은 셀 수 있고 객체는 그렇지 않다는 것이 제 생각에는 꽤 솔직한 것 같습니다.

아마 당신이 얻을 가장 가까운 것은 이런 것입니다.

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

그러나 이것은 문제 또는 적어도 질문을 만듭니다. _length 함수 자체를 포함하여 모든 사용자 생성 속성이 계산됩니다! 이 간단한 예제에서는 일반 함수를 사용하여 피할 수 있지만 다른 스크립트가이 작업을 수행하는 것을 막을 수는 없습니다. 그래서 당신은 무엇을합니까? 함수 속성을 무시 하시겠습니까?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

결국, 나는 당신이 당신의 물건을 셀 수있게 만드는 아이디어를 버리고 당신이하고있는 일을하는 다른 방법을 찾아야한다고 생각합니다.


8
위험은 로빈슨입니다! Object에 대항 하지 마십시오 ! 모든 것이 Object에서 내려 오므로 상당한 양의 JS 작업을 수행하는 경우 이와 같이 클라이언트 처리가 손상됩니다.
annakata 2009-06-05

5
어 .. "원숭이를 고의로 지적하기 위해 패치"라는 댓글에 쓴 부분을 읽지 않았습니까?-제발, 사람들이 그것에 대해 조금도 뒤집지 않도록 의도적으로 그렇게했습니다. 게다가, 내가 원숭이 패치를 옹호하지는 않지만, 이것이 성능 문제를 일으킬 것이라고 생각한다면 자바 스크립트에서 프로토 타입 체인이 어떻게 작동하는지 오해 할 것입니다. video.yahoo.com/watch/111585/1027823
Peter Bailey

그래서 .. 이건해야할까요, 안할까요?
OscarRyz

"Javascript : The Good Parts"에서 그는 "create ()"메소드로 객체를 프로토 타입합니다. 나는 그것이 자바 스크립트에 대한 정의적인 책이라고 믿습니다.
크리스 Dutrow

1

수 / 길이 / 차원의 개념은 개체에 대해 실제로 의미가 없으며, 이것이 필요하다는 것은 나에게 배열을 정말로 원한다는 것을 암시합니다.

편집 : 당신이 이것을 위해 O (1)를 원한다고 나에게 지적했습니다. 내가 아는 한 그러한 방법은 존재하지 않습니다.


그는 자신을 반복 할 것을 제안했는데, 이것이 바로이 솔루션입니다. 그는 ...이 달성하기 위해 (1) 방법 오 필요
토마스 한센

당신 말이 맞습니다. 질문을 더 자세히 읽어야합니다.
annakata 2009-06-05

실제로 객체는 JS에있는지도에 가장 가까운 것입니다. 지도에는 길이가 있습니다.
크리스티안 Vrabie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.