Abrufen der JavaScript-Objektschlüsselliste

295

Ich habe ein JavaScript-Objekt wie

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

Wie kann ich die Länge und Liste der Schlüssel in diesem Objekt ermitteln?

user160820
quelle
Mögliches Duplikat von Get Property Names In JSON Objects
TJ
@TJ Ich denke, es ist nicht ganz das gleiche. Dies ist ein Objekt, das Duplikat ist ein JSON-Objekt.
GuyT
Wenn Sie einen Unterstrich haben, dann einfach _.keys (Ihr_Objekt)
minhajul
1
Da sich die Dinge seit 2010 geändert haben, ist es möglicherweise besser, die am besten bewertete Antwort als "die Antwort" zu akzeptieren
Jonas Wilms

Antworten:

341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);

zed_0xff
quelle
Ich nehme nicht an, dass Javascript wie PHP ist, wo Sie die erste Zeile insgesamt überspringen können? Nicht, dass so etwas sowieso ratsam wäre.
Bart van Heukelom
@Bart: Nein, die erste Zeile ist in JavaScript erforderlich.
Daniel Vassallo
6
Sie sollten sich David Morrisseys Kommentar unten ansehen, um hier einen Randfall zu finden. Manchmal führt dieser Ansatz dazu, dass unerwünschte Mitglieder des Prototyps in auftauchen keys.
2
@pat: Wenn Sie Objektliterale verwenden, geschieht dies nur, wenn Sie erweitern Object.prototype, was Sie sowieso nicht tun sollten. Für benutzerdefinierte Konstruktoren haben Sie jedoch Recht.
Sasha Chedygov
@BartvanHeukelom bereits im Juni 2010, der einen Hinweis verursachte, da dies bedeutet, dass Sie das Objekt implizit eingeben. Durch Zuweisen [](oder array()damals) wird es zu einem Array, das Sie dann sicher als Array verwenden können.
Niels Keurentjes
627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

Es unterstützt jetzt auf den meisten gängigen Browsern.

Anurag
quelle
7
Die Tatsache, dass es in Chrome funktioniert, bedeutet auch, dass es in Node.js funktioniert, da beide auf der V8-Javascript-Engine basieren.
Homme Zwaagstra
9
@fet Heutzutage ja. Vor zwei Jahren nicht so sehr.
AlbertEngelB
4
Beachten Sie, dass dies anders ist als for(key in ob)! Object.keyslistet die Schlüssel von Prototypen nicht auf, .. in objtut es aber .
Albert
9
@fet Windows7 kam mit IE8. So großartig es auch sein mag, es gibt keine Möglichkeit, dies zu akzeptieren, bis die Leute IE8 nicht mehr verwenden.
kuschelt sich
1
Hier entwickler.mozilla.org/en-US/docs/Web/JavaScript/Reference/… finden Sie eine JavaScript-Methode, die in alten Browsern korrekt funktioniert und die Funktionalität in neueren Browsern nicht überschreibt. Siehe auch meine Antwort unten.
Sandro
27

Underscore.js macht die Transformation ziemlich sauber:

var keys = _.map(x, function(v, k) { return k; });

Edit: Ich habe vermisst, dass du das auch kannst:

var keys = _.keys(x);
Mikebridge
quelle
Das ist richtig, die eigentliche Unterstrichquelle: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || function (obj) {if (obj! == Object (obj)) wirft einen neuen TypeError ('Ungültiges Objekt'); var keys = []; für (var key in obj) if ( .has (obj, key)) keys.push (key); Rückgabeschlüssel; };
Miguel Alejandro Fuentes Lopez
18

Wenn Sie nur die Schlüssel möchten, die für dieses bestimmte Objekt spezifisch sind, und keine abgeleiteten prototypeEigenschaften:

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

z.B:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
Kryo
quelle
4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

Um auf einen beliebigen Wert des Objekts zuzugreifen, können Sie obj [Schlüssel] verwenden.

Mohan Gundlapalli
quelle
Sie müssen Array-Index
erhöhen
Der Array-Index wird automatisch um erhöht keys.length, was für jede Iteration unterschiedlich ist, da jede Iteration einen Wert einfügt.
KrekkieD
4
obj = {'a':'c','b':'d'}

Du kannst es versuchen:

[index for (index in obj)] 

dies wird zurückkehren:

['a','b']

um die Liste der Schlüssel zu erhalten oder

[obj[index] for (index in obj)]

um die Werte zu erhalten

Jim Nolan
quelle
Funktioniert nicht in Google Chrome v16.0.912.75, aber es funktioniert in Firefox v10.0
RobM
4

Anurags Antwort ist grundsätzlich richtig. Zur Unterstützung auch Object.keys(obj)in älteren Browsern können Sie den folgenden Code verwenden, der von https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys kopiert wurde . Es fügt die Object.keys(obj)Methode hinzu , wenn sie nicht im Browser verfügbar ist.

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function(obj) {
  if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
    throw new TypeError('Object.keys called on non-object');
  }

  var result = [], prop, i;

  for (prop in obj) {
    if (hasOwnProperty.call(obj, prop)) {
      result.push(prop);
    }
  }

  if (hasDontEnumBug) {
    for (i = 0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) {
        result.push(dontEnums[i]);
      }
    }
  }
  return result;
};
}());
}
Sandro
quelle
3

Beachten Sie, dass dies in Coffeescript in allen Browsern und Knoten als möglich ist

k for k of obj

und somit

(1 for _ of obj).length
Tim James
quelle
3

Rekursive Lösung für Browser, die ECMAScript 5 unterstützen:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};
Jordi
quelle
3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)
Bajran
quelle
3

Wenn Sie sich für Underscore.js entscheiden, sollten Sie dies besser tun

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);
mohammad javad ahmadi
quelle
3

In JavaScript ist ein Objekt eine eigenständige Entität mit Eigenschaften und Typ.

Zum Abrufen von Werten aus dem Objekt in Form eines Arrays: Object .values ​​(obj) // obj ist der Objektname, den Sie verwendet haben. Ergebnis -> ["Wert1", "Wert2", "Wert3", "Wert4"]

Zum Abrufen von Schlüsseln von Object in Form eines Arrays: Object .keys (obj) // obj ist der Objektname, den Sie verwendet haben. Ergebnis -> ["key1", "key2", "key3", "key4"]

Da beide Funktionen ein Array zurückgeben, können Sie die Länge der Schlüssel oder des Werts mithilfe der Eigenschaft length ermitteln. Zum Beispiel - Objekt .Werte (obj) .Länge oder Objektschlüssel (obj) .Länge

Rakesh Soni
quelle
2

Versuchen Sie Folgendes, um eine durch Kommas getrennte Zeichenfolge mit den Schlüsseln eines JSON-Objekts aufzulisten:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */
Christian
quelle
2

Mit ES6 können Sie forEachdie Schlüssel eines Objekts durchlaufen. Um alle Schlüssel zu erhalten, können Sie Object.keysalle Schlüssel in einem Objekt zurückgeben

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

Kurze Hand des obigen Snippets wäre, die nur einen Parameter akzeptiert

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});
Rinav
quelle
1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }
Prathamesh Sawant
quelle
0

Mit Slice anwenden und verbinden.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());

quelle