Lengte van een JavaScript-object

Ik heb een JavaScript-object. Is er een ingebouwde of geaccepteerde manier om de lengte van dit object te krijgen?

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

Antwoord 1, Autoriteit 100%

Het meest robuuste antwoord (d.w.z. dat de bedoeling van wat u probeert te doen terwijl u de minste bugs probeert te doen) zou zijn:

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);

Antwoord 2, Autoriteit 66%

Als u weet dat u zich geen zorgen hoeft te maken over hasOwnPropertyCheques, kunt u dit heel eenvoudig doen:

Object.keys(myArray).length

Antwoord 3, Autoriteit 10%

Bijgewerkt : als u underscore.js (aanbevolen, is het lichtgewicht!), Dan je kunt gewoon doen

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

Zo niet , en u wilt niet om de redenen van Objecteigenschappen rommelen, en gebruikt u al jQuery, een plug-in is even toegankelijk:

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

Antwoord 4, autoriteit 2%

Dit is de meest cross-browser oplossing.

Dit is beter dan het geaccepteerde antwoord omdat het native Object.keys gebruikt, indien aanwezig.
Het is dus de snelste voor alle moderne browsers.

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;

Antwoord 5

Ik ben geen JavaScript-expert, maar het lijkt erop dat je door de elementen moet lopen en ze moet tellen, aangezien Object geen lengtemethode heeft:

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

@palmsey: In alle eerlijkheid tegenover de OP, verwijst de JavaScript-documentatie eigenlijk expliciet naar het gebruik van variabelen van het type Object op deze manier als “associatieve arrays”.


Antwoord 6

Gebruik dit gewoon om de lengthte krijgen:

Object.keys(myObject).length

Antwoord 7

Deze methode haalt alle eigenschapsnamen van uw object in een array, zodat u de lengte van die array kunt krijgen die gelijk is aan de lengte van de sleutels van uw object.

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

Antwoord 8

Om niet te knoeien met het prototype of andere code, kun je je eigen object bouwen en uitbreiden:

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

Als je altijd de add-methode gebruikt, is de eigenschap length correct. Als je bang bent dat jij of anderen vergeten het te gebruiken, kun je ook de eigenschappenteller die de anderen hebben gepost aan de lengtemethode toevoegen.

Natuurlijk kunt u de methoden altijd overschrijven. Maar zelfs als je dat doet, zou je code waarschijnlijk merkbaar falen, waardoor het gemakkelijk te debuggen is. 😉


Antwoord 9

We kunnen de lengte van Object vinden door:

const myObject = {};
console.log(Object.values(myObject).length);

Antwoord 10

Hier leest u hoe en vergeet niet te controleren of het pand niet in de prototypeketen staat:

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

Antwoord 11

Hier is een compleet andere oplossing die alleen werkt in modernere browsers (Internet Explorer 9+, Chrome, Firefox 4+, Opera 11.60+ en Safari 5.1+)

Bekijk deze jsFiddle.

Uw associatieve array-klasse instellen

/**
 * @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;
    }
});

U kunt deze code nu als volgt gebruiken…

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

Antwoord 12

Gebruik Object.keys(myObject).lengthom de lengte van object/array te krijgen

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

Antwoord 13

<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>

Antwoord 14

Als u een associatieve gegevensstructuur nodig heeft die de grootte ervan laat zien, kunt u beter een kaart gebruiken in plaats van een object.

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

Antwoord 15

In sommige gevallen is het beter om de grootte gewoon in een aparte variabele op te slaan. Vooral als u één element op één plaats aan de array toevoegt en de grootte gemakkelijk kunt vergroten. Het zou natuurlijk veel sneller werken als je de maat vaak moet controleren.


Antwoord 16

Gebruik:

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

Antwoord 17

@palmsey: In alle eerlijkheid tegenover de OP, verwijst de JavaScript-documentatie eigenlijk expliciet naar het gebruik van variabelen van het type Object op deze manier als “associatieve arrays”.

En om eerlijk te zijn tegenover @palmsey had hij helemaal gelijk. Het zijn geen associatieve arrays; het zijn zeker objecten 🙂 – doen het werk van een associatieve array. Maar wat betreft het bredere punt, je lijkt er zeker recht op te hebben volgens dit nogal mooie artikel dat ik vond:

JavaScript “Associative arrays” als schadelijk beschouwd

Maar volgens dit alles is het geaccepteerde antwoordzelf een slechte gewoonte ?

Specificeer een functie voor prototype size() voor Object

Als er iets anders is toegevoegd aan Object .prototype, zal de voorgestelde code mislukken:

<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>

Ik denk niet dat dat antwoord het geaccepteerde antwoord moet zijn, omdat het niet kan worden vertrouwd om te werken als er andere code in dezelfde uitvoeringscontext wordt uitgevoerd. Om het op een robuuste manier te doen, moet u zeker de groottemethode binnen myArray definiëren en controleren op het type leden terwijl u ze doorloopt.


Antwoord 18

De eenvoudigste manier is als volgt:

Object.keys(myobject).length

waar MyObject het doel is van wat u wilt dat de lengte van.


Antwoord 19

Hoe zit het met zoiets –

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--; }}
}

Antwoord 20

Als we de hash

hebben

HASH = {“A”: “B”, “C”: “D”};

We kunnen de lengte krijgen met behulp van de lengte van de sleutels die de lengte van de hash is:

KEYS (HASH) .LENGTH


Antwoord 21

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. object.Values ​​(myobject) .length
  2. Object.Entries (MyObject). Lengte
  3. Object.Keys (MyObject) .lengte

Antwoord 22

Als u angularjs 1.x kunt doen, kunt u dingen doen die de Angularjs-manier is door een Filter en gebruik de code van een van de andere voorbeelden zoals het volgende:

// 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;
 }
})

gebruik

In uw controller:

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

Of naar jouw mening:

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

Antwoord 23

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
console.log(Object.keys(myObject).length)
// o/p 3

Antwoord 24

Een variatie op een aantal van bovenstaande is:

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

Het is een wat elegantere manier om hasOwnProp te integreren.


Antwoord 25

Als u Internet Explorer 8 of lager niet wilt ondersteunen, kunt u eenvoudig het aantal eigenschappen in een object verkrijgen door de volgende twee stappen toe te passen:

  1. Voer een van de Object.keys()om een array te krijgen die de namen bevat van alleen die eigenschappen die enumerableof Object.getOwnPropertyNames()als u ook de namen wilt opnemen van eigenschappen die niet opsombaar.
  2. Verkrijg de .lengtheigendom van die array.

Als u dit meer dan eens moet doen, kunt u deze logica in een functie inpakken:

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

Hoe deze specifieke functie te gebruiken:

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

Zie ook deze viool voor een demo.


Antwoord 26

Hier is een andere versie van het antwoord van James Cogan. In plaats van een argument te passeren, proteert u gewoon de objectklasse en maak de codereiniger.

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 Voorbeeld: http://jsfiddle.net/qar4j/1/


Antwoord 27

U kunt eenvoudig Object.keys(obj).lengthop elk object om zijn lengte te krijgen. Object.Keys retourneert een array die al het object toetsen (eigenschappen) bevat dat van pas kan komen voor het vinden van de lengte van dat object met behulp van de lengte van de overeenkomstige array. U kunt zelfs een -functie hiervoor schrijven. Laten we Creative krijgen en schrijf een methode voor het ook (samen met een meer convienetent Getter Property):

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()

Antwoord 28

U kunt altijd Object.getOwnPropertyNames(myObject).lengthom hetzelfde resultaat te krijgen als [].lengthzou geven voor normale array.


Antwoord 29

Een leuke manier om dit te bereiken (Internet & NBSP; Explorer & NBSP; ALLEEN’S ALLEEN) is om een ​​magische getter te definiëren op de eigenschap Lengte:

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

en u kunt het gewoon gebruiken zoals SO:

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

het zou 1geven.


ANTWOORD 30

Hieronder is een versie van het antwoord van James Coglan in Coffeescript voor diegenen die rechtdoor hebben verlaten JavaScript 🙂

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

Other episodes