JavaScript 개체가 있습니다. 이 객체의 길이를 얻는 기본 제공되거나 허용되는 모범 사례가 있습니까?
const myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "Simpson"; myObject["age"] = 21;
질문자 :Gareth Simpson
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 const myObj = {} 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() 메서드를 사용할 수 있습니다.
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 유형의 변수를 "연관 배열"로 사용하는 것을 명시적으로 언급합니다.
이것을 사용하여 length
를 얻으십시오.
Object.keys(myObject).length
이 메소드는 배열에 있는 모든 객체의 속성 이름을 가져오므로 객체의 키 길이와 동일한 배열의 길이를 얻을 수 있습니다.
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 메서드를 사용하면 길이 속성이 정확합니다. 당신이나 다른 사람들이 그것을 사용하는 것을 잊는 것이 걱정된다면 다른 사람들이 게시한 속성 카운터도 길이 메서드에 추가할 수 있습니다.
물론 메서드를 항상 덮어쓸 수 있습니다. 그러나 그렇게 하는 경우에도 코드가 눈에 띄게 실패할 수 있으므로 디버그하기 쉽습니다. ;)
다음을 사용하여 Object의 길이를 찾을 수 있습니다.
const myObject = {}; console.log(Object.values(myObject).length);
다음은 속성이 프로토타입 체인에 없는지 확인하는 방법입니다.
var element_count = 0; for(var e in myArray) if(myArray.hasOwnProperty(e)) element_count++;
다음은 최신 브라우저(Internet Explorer 9+, 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);
Object.keys(myObject).length
를 사용하여 개체/배열의 길이를 가져옵니다.
var myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "Simpson"; myObject["age"] = 21; console.log(Object.keys(myObject).length); //3
<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;
크기를 노출하는 연관 데이터 구조가 필요한 경우 객체 대신 맵을 사용하는 것이 좋습니다.
const myMap = new Map(); myMap.set("firstname", "Gareth"); myMap.set("lastname", "Simpson"); myMap.set("age", 21); console.log(myMap.size); // 3
어떤 경우에는 크기를 별도의 변수에 저장하는 것이 좋습니다. 특히 배열에 요소를 한곳에 추가하고 크기를 쉽게 늘릴 수 있는 경우. 크기를 자주 확인해야 하는 경우 분명히 훨씬 더 빠르게 작동합니다.
사용하다:
var myArray = new Object(); myArray["firstname"] = "Gareth"; myArray["lastname"] = "Simpson"; myArray["age"] = 21; obj = Object.keys(myArray).length; console.log(obj)
@palmsey: OP에 공평하게, JavaScript 문서는 실제로 이러한 방식으로 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 내에서 size 메서드를 정의하고 멤버를 반복할 때 멤버 유형을 확인해야 합니다.
가장 간단한 방법은 다음과 같습니다.
Object.keys(myobject).length
여기서 myobject는 원하는 길이의 대상입니다.
이런 건 어때요-
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": "d"};
해시의 길이인 키의 길이를 사용하여 길이를 얻을 수 있습니다.
키(해시).길이
var myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "Simpson"; myObject["age"] = 21;
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>
const myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "Simpson"; myObject["age"] = 21; console.log(Object.keys(myObject).length) // o/p 3
위의 일부 변형은 다음과 같습니다.
var objLength = function(obj){ var key,len=0; for(key in obj){ len += Number( obj.hasOwnProperty(key) ); } return len; };
hasOwnProp을 통합하는 좀 더 우아한 방법입니다.
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
데모 는 이 Fiddle 도 참조하십시오.
다음은 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.getOwnPropertyNames(myObject).length
[].length
가 일반 배열에 대해 제공하는 것과 동일한 결과를 얻을 수 있습니다.
이를 달성하는 좋은 방법(Internet Explorer 9 이상에만 해당)은 length 속성에 매직 getter를 정의하는 것입니다.
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
출처 : http:www.stackoverflow.com/questions/5223/length-of-a-javascript-object
__init__() 메서드로 Python super() 이해하기 [중복] (0) | 2021.11.11 |
---|---|
두 JavaScript 객체의 속성을 동적으로 병합하려면 어떻게 해야 합니까? (0) | 2021.11.11 |
C#의 올바른 버전 번호는 무엇입니까? (0) | 2021.11.11 |
sleep()의 JavaScript 버전은 무엇입니까? (0) | 2021.11.11 |
Python에서 수동으로 예외 발생(던지기) (0) | 2021.11.11 |