문제

JavaScript 개체가 있는 경우 다음과 같이 말하세요.

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

이 객체의 길이를 얻는 기본 제공되거나 허용되는 모범 사례 방법이 있습니까?

도움이 되었습니까?

해결책

가장 강력한 답변(예:버그를 최소화하면서 수행하려는 작업의 의도를 포착하는 방법은 다음과 같습니다.

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myObj);

JavaScript에는 일종의 규칙이 있습니다. Object.prototype에 항목을 추가하지 마세요., 다양한 라이브러리에서 열거형을 깨뜨릴 수 있기 때문입니다.그러나 Object에 메서드를 추가하는 것은 일반적으로 안전합니다.


2016년 기준 업데이트 내용은 다음과 같습니다. ES5의 광범위한 배포 이후. IE9+ 및 기타 모든 최신 ES5+ 지원 브라우저의 경우 다음을 사용할 수 있습니다. Object.keys() 따라서 위의 코드는 다음과 같습니다.

var size = Object.keys(myObj).length;

이후 기존 프로토타입을 수정할 필요가 없습니다. Object.keys() 이제 내장되었습니다.

편집하다:객체는 Object.key 메소드를 통해 반환될 수 없는 기호 속성을 가질 수 있습니다.따라서 언급하지 않으면 대답이 불완전합니다.

객체 속성에 대한 고유 식별자를 생성하기 위해 기호 유형이 언어에 추가되었습니다.기호 유형의 주요 이점은 덮어쓰기 방지입니다.

Object.keys 또는 Object.getOwnPropertyNames 기호 속성에는 작동하지 않습니다.반환하려면 다음을 사용해야 합니다. Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

다른 팁

알고 계시다면 걱정할 필요가 없습니다. hasOwnProperty 매우 간단하게 이 작업을 수행할 수 있습니다.

Object.keys(myArray).length

업데이트됨:당신이 사용하는 경우 Underscore.js (권장, 가볍습니다!) 그러면 그냥 할 수 있습니다

_.size({one : 1, two : 2, three : 3});
=> 3

그렇지 않은 경우, 어떤 이유로든 객체 속성을 조작하고 싶지 않고 이미 jQuery를 사용하고 있다면 플러그인에 동일하게 액세스할 수 있습니다.

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

가장 크로스 브라우저 솔루션은 다음과 같습니다.

존재하는 경우 기본 Object.keys를 사용하기 때문에 허용되는 답변보다 낫습니다.따라서 모든 최신 브라우저에서 가장 빠릅니다.

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

저는 JavaScript 전문가는 아니지만 Object에 길이 메서드가 없기 때문에 요소를 반복하여 계산해야 할 것 같습니다.

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey:OP에 대한 공정성을 고려하여 JavaScript 문서에서는 실제로 이러한 방식으로 Object 유형의 변수를 "연관 배열"로 사용하는 것을 명시적으로 참조합니다.

이 방법은 배열에 있는 모든 객체의 속성 이름을 가져오므로 객체의 키 길이와 동일한 배열의 길이를 얻을 수 있습니다.

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

프로토타입이나 다른 코드를 망치지 않으려면 자신만의 객체를 만들고 확장할 수 있습니다.

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

항상 add 메소드를 사용하면 길이 속성이 정확합니다.당신이나 다른 사람들이 그것을 사용하는 것을 잊어버릴까봐 걱정된다면, 다른 사람들이 게시한 속성 카운터를 length 메소드에 추가할 수도 있습니다.

물론 언제든지 메서드를 덮어쓸 수 있습니다.하지만 그렇게 한다고 해도 코드가 눈에 띄게 실패할 수 있으므로 디버그하기가 쉽습니다.;)

가장 간단한 것은

Object.keys(myObject).length

속성이 프로토타입 체인에 없는지 확인하는 방법은 다음과 같습니다.

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;

간단히 이것을 사용하여 length:

Object.keys(myObject).length

어떤 경우에는 크기를 별도의 변수에 저장하는 것이 더 좋습니다.특히, 한 곳에서 한 요소씩 배열에 추가하는 경우 쉽게 크기를 늘릴 수 있습니다.크기를 자주 확인해야 한다면 분명히 훨씬 빠르게 작동할 것입니다.

다음은 최신 브라우저(IE9+, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)에서만 작동하는 완전히 다른 솔루션입니다.

보다 jsFiddle

연관 배열 클래스 설정

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

이제 이 코드를 다음과 같이 사용할 수 있습니다.

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

사용:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)

@palmsey:OP에 대한 공정성을 고려하여 자바스크립트 문서에서는 실제로 이러한 방식으로 Object 유형의 변수를 "연관 배열"로 사용하는 것을 명시적으로 참조합니다.

그리고 @palmsey에 대한 공평함에서 그는 매우 정확했습니다. 그들은 연관 배열이 아니며 확실히 객체입니다 :) - 연관 배열의 작업을 수행합니다.그러나 더 넓은 관점에 관해서는 내가 찾은 다음과 같은 훌륭한 기사에 따르면 당신이 확실히 그럴 권리가 있는 것 같습니다.

유해한 것으로 간주되는 JavaScript "연관 배열"

하지만 이 모든 것에 따르면, 그렇지 않습니까? 수락된 답변 그 자체가 나쁜 습관인가요?

Object에 대한 프로토타입 size() 함수 지정

Object .prototype에 다른 것이 추가된 경우 제안된 코드는 실패합니다.

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

동일한 실행 컨텍스트에서 실행되는 다른 코드가 있는 경우 작동을 신뢰할 수 없기 때문에 대답이 허용되어야 한다고 생각하지 않습니다.강력한 방식으로 이를 수행하려면 myArray 내에서 크기 메소드를 정의하고 멤버를 반복하면서 멤버 유형을 확인해야 합니다.

이런 건 어떨까요?

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}

해시가 있으면

해시 = {"a":"b", "c":"디"};

해시의 길이인 키의 길이를 사용하여 길이를 얻을 수 있습니다.

키(해시).길이

당신이 사용하는 경우 AngularJS 1.x에서는 필터를 만들고 다음과 같은 다른 예제의 코드를 사용하여 AngularJS 방식으로 작업을 수행할 수 있습니다.

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

용법

컨트롤러에서:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

아니면 당신의 견해로는:

<any ng-expression="object | lengthOfObject"></any>

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

이것은 나에게 효과적입니다.

var size = Object.keys(myObj).length;

크기를 노출하는 연관 데이터 구조가 필요한 경우 객체 대신 지도를 사용하는 것이 좋습니다.

var myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

위의 일부 변형은 다음과 같습니다.

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

hasOwnProp을 통합하는 좀 더 우아한 방법입니다.

Internet Explorer 8 이하 지원에 관심이 없다면 다음 두 단계를 적용하여 개체의 속성 수를 쉽게 가져올 수 있습니다.

  1. 다음 중 하나를 실행하세요. Object.keys() 해당 속성의 이름만 포함된 배열을 얻으려면 열거할 수 있는 또는 Object.getOwnPropertyNames() 열거할 수 없는 속성의 이름도 포함하려는 경우.
  2. 받기 .length 해당 배열의 속성입니다.

이 작업을 두 번 이상 수행해야 하는 경우 이 논리를 함수로 래핑할 수 있습니다.

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

이 특정 기능을 사용하는 방법:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

또한보십시오 이 바이올린 데모를 위해.

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. 객체.값(myObject).길이
  2. Object.entries(myObject).length
  3. Object.keys(myObject).length

James Cogan의 답변의 다른 버전은 다음과 같습니다.인수를 전달하는 대신 Object 클래스의 프로토타입을 만들고 코드를 더욱 깔끔하게 만듭니다.

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle 예: http://jsfiddle.net/qar4j/1/

당신은 단순히 사용할 수 있습니다 Object.keys(obj).length 어떤 물체에서든 길이를 구합니다.Object.keys는 모든 객체를 포함하는 배열을 반환합니다. 열쇠 (속성) 해당 배열의 길이를 사용하여 해당 객체의 길이를 찾는 데 유용할 수 있습니다.당신은 심지어 기능 이를 위해.의는하자 창의적인 그리고 방법 (보다 편리한 getter 속성과 함께):

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

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()

가장 간단한 방법은 이렇습니다

Object.keys(myobject).length

여기서 myobject는 원하는 길이의 객체입니다.

넌 언제나 할 수 있어 Object.getOwnPropertyNames(myObject).length 와 같은 결과를 얻으려면 [].length 일반 배열을 제공합니다.

다음은 JavaScript를 직접 포기한 사람들을 위한 CoffeeScript의 James Coglan 답변 버전입니다. :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

재산

Object.defineProperty(Object.prototype, 'length', {
    get: function () {
        var size = 0, key;
        for (key in this)
            if (this.hasOwnProperty(key))
                size++;
        return size;
    }
});

사용

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4

다음을 사용하여 객체의 길이를 찾을 수 있습니다.

Object.values(myObject).length

게임이 조금 늦었지만 이를 달성하는 좋은 방법(IE9+에만 해당)은 길이 속성에 매직 게터를 정의하는 것입니다.

Object.defineProperty(Object.prototype, "length", {
    get: function () {
        return Object.keys(this).length;
    }
});

그리고 다음과 같이 사용할 수 있습니다.

var myObj = { 'key': 'value' };
myObj.length;

줄 것이다 1.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top