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

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

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

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

var obj = new Object ;



답변

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 객체를 사용하는 것보다 문제에 대한 더 나은 솔루션 일 수 있습니다.


답변

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

Object.keys(obj).length

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


답변

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

$(yourObject).length

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


답변

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);


답변

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

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


답변

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

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


답변