JavaScript 객체가 있습니다.이 객체의 길이를 가져 오는 기본 제공 방법이 있습니까?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Object.keys(obj).length
JavaScript 객체가 있습니다.이 객체의 길이를 가져 오는 기본 제공 방법이 있습니까?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Object.keys(obj).length
답변:
가장 강력한 답변 (즉, 버그를 최소화하면서 시도하려는 의도를 포착하는)은 다음과 같습니다.
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 메서드를 통해 반환 할 수없는 기호 속성이있을 수 있습니다. 따라서 대답은 언급하지 않고 불완전합니다.
객체 속성에 대한 고유 식별자를 만들기 위해 언어에 심볼 유형이 추가되었습니다. Symbol 유형의 주요 이점은 덮어 쓰기 방지입니다.
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
Object.keys(obj).length
hasOwnProperty
검사에 대해 걱정할 필요가 없다는 것을 알고 있다면 다음과 같이 간단하게 수행 할 수 있습니다.
Object.keys(myArray).length
업데이트 : Underscore.js를 사용하는 경우 (권장, 경량입니다!)
_.size({one : 1, two : 2, three : 3});
=> 3
그렇지 않고 어떤 이유로 든 Object 속성을 엉망으로 만들고 싶지 않고 이미 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;
};
_.size()
underscore.js를 지원하는 Meteor 프로젝트를 위한 완벽한 솔루션이었습니다 .
가장 다양한 브라우저 솔루션이 있습니다.
존재하는 경우 기본 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;
Object.keys()
열거 가능한 속성의 이름 만 포함 된 배열을 반환합니다. ALL 속성을 가진 배열을 원한다면 Object.getOwnPropertyNames()
대신 사용해야 합니다. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…를
저는 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 특성이 올바른 것입니다. 본인이나 다른 사람이 사용을 잊어 버릴 염려가 있으면 다른 사람이 길이 측정법에 게시 한 속성 카운터를 추가 할 수도 있습니다.
물론 항상 메서드를 덮어 쓸 수 있습니다. 그러나 그렇게해도 코드가 눈에 띄게 실패하여 쉽게 디버깅 할 수 있습니다. ;)
간단히 이것을 사용하여 length
:
Object.keys(myObject).length
myArray
최신 브라우저에서만 작동하는 완전히 다른 솔루션입니다 (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);
length
속성 을 사용한 경우 값을 저장하고 싶지 않다고 생각합니다. 사용 한 모든 코드는에 대해 시도하지 않고 저장하지 않도록해야하지만 코드가 length
같으면 같을 것입니다. 표준 배열도. hasOwnProperty
모든 객체를 재정의 하면 바람직하지 않은 결과가 발생할 수 있습니다.
<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 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에 대한 프로토 타입 크기 () 함수를 지정하십시오.
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 내에서 size 메소드를 정의하고 반복 할 때 멤버의 유형을 확인해야합니다.
해시가 있다면
hash = { "a": "b", "c": "d"};
해시의 길이 인 키의 길이를 사용하여 길이를 얻을 수 있습니다.
키 (해시). 길이
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
당신이 사용하는 경우 AngularJS와를 필터를 생성하며 다음과 같은 다른 예제의에서 코드를 사용하여 사물에게 AngularJS와 방법을 할 수 1.X :
// 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>
Internet Explorer 8 이하를 지원하지 않아도되는 경우 다음 두 단계를 적용하여 개체의 속성 수를 쉽게 얻을 수 있습니다.
Object.keys()
있는 속성의 이름 만 포함 하거나 열거Object.getOwnPropertyNames()
할 수없는 속성의 이름도 포함하려는 배열을 가져 오려면 실행하십시오 ..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
데모 는 이 바이올린 을 참조하십시오 .
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.prototype
- 나쁜 생각.
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.getOwnPropertyNames(myObject).length
과 동일한 결과를 얻도록 할 수 있습니다 [].length
.
Object.keys()
열거 가능한 속성의 이름 만 포함 된 배열을 반환합니다. ALL 속성을 가진 배열을 원한다면 Object.getOwnPropertyNames()
대신 사용해야 합니다. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…를
게임에 약간 늦었지만 이것을 달성하는 좋은 방법 (IE9 + 만 해당)은 length 속성에 매직 게터를 정의하는 것입니다.
Object.defineProperty(Object.prototype, "length", {
get: function () {
return Object.keys(this).length;
}
});
그리고 당신은 그렇게 사용할 수 있습니다 :
var myObj = { 'key': 'value' };
myObj.length;
줄 것이다 1
.
아래는 JavaScript를 버린 사람들을위한 CoffeeScript의 James Coglan 답변입니다. :)
Object.size = (obj) ->
size = 0
size++ for own key of obj
size
size++ for own key of obj
( own key
커피 스크립트에서 문법 설탕 인) 말하고 싶을 것입니다 . hasOwnProperty
객체가 실제로 그러한 속성을 가질 때 깨지기 때문에 객체에서 직접 사용 하는 것은 위험합니다.