자바 스크립트 객체의 요소 수를 (어딘가에서) 얻는 방법이 있습니까 ?? (즉, 일정 시간 복잡성).
해당 정보를 검색하는 속성이나 메서드를 찾을 수 없습니다. 지금까지는 전체 컬렉션을 반복하는 것만 생각할 수 있었지만 그것은 선형 시간입니다.
물체의 크기에 직접 접근 할 수 없다는 것이 이상합니다.
편집 :
나는 Object
객체 (일반적으로 객체가 아님) 에 대해 이야기하고 있습니다 .
var obj = new Object ;
자바 스크립트 객체의 요소 수를 (어딘가에서) 얻는 방법이 있습니까 ?? (즉, 일정 시간 복잡성).
해당 정보를 검색하는 속성이나 메서드를 찾을 수 없습니다. 지금까지는 전체 컬렉션을 반복하는 것만 생각할 수 있었지만 그것은 선형 시간입니다.
물체의 크기에 직접 접근 할 수 없다는 것이 이상합니다.
편집 :
나는 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 객체를 사용하는 것보다 문제에 대한 더 나은 솔루션 일 수 있습니다.
__count__
가 사라졌습니다 :(
hasOwnProperty()
합니까?
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)를 원한다고 나에게 지적했습니다. 내가 아는 한 그러한 방법은 존재하지 않습니다.