JavaScript 객체가 있습니다.이 객체의 길이를 가져 오는 기본 제공 방법이 있습니까?
const 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 메서드를 통해 반환 할 수없는 기호 속성이있을 수 있습니다. 따라서 대답은 언급하지 않고 불완전합니다.
객체 속성에 대한 고유 식별자를 만들기 위해 언어에 심볼 유형이 추가되었습니다. 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
답변
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;
};
답변
가장 다양한 브라우저 솔루션이 있습니다.
존재하는 경우 기본 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 특성이 올바른 것입니다. 본인이나 다른 사람이 사용을 잊어 버릴 염려가 있으면 다른 사람이 길이 측정법에 게시 한 속성 카운터를 추가 할 수도 있습니다.
물론 항상 메서드를 덮어 쓸 수 있습니다. 그러나 그렇게해도 코드가 눈에 띄게 실패하여 쉽게 디버깅 할 수 있습니다.