Pobieranie listy kluczy obiektów JavaScript

295

Mam obiekt JavaScript jak

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

Jak mogę uzyskać długość i listę kluczy w tym obiekcie?

użytkownik160820
źródło
@TJ Myślę, że to nie do końca takie samo. To jest obiekt, duplikat to obiekt JSON.
GuyT
jeśli masz podkreślenie, po prostu _. klucze (twój_obiekt)
minhajul
1
Ponieważ od 2010 roku wszystko się zmieniło, lepiej zaakceptować najbardziej pozytywną odpowiedź jako „odpowiedź”
Jonas Wilms,

Odpowiedzi:

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
źródło
Nie sądzę, że JavaScript jest jak PHP, w którym można całkowicie pominąć pierwszy wiersz? W każdym razie nie jest to wskazane.
Bart van Heukelom,
@Bart: Nie, pierwsza linia jest wymagana w JavaScript.
Daniel Vassallo,
6
Powinieneś rzucić okiem na komentarz Davida Morrisseya poniżej, aby znaleźć przypadek na krawędzi. Czasami przyjęcie takiego podejścia spowoduje pojawienie się niechcianych członków prototypu keys.
2
@pat: Jeśli używasz literałów obiektowych, stanie się to tylko po rozszerzeniu Object.prototype, czego i tak nie powinieneś robić. Jednak w przypadku niestandardowych konstruktorów masz rację.
Sasha Chedygov
@BartvanHeukelom jeszcze w czerwcu 2010 r. Spowodowało to powiadomienie, ponieważ oznacza to, że domyślnie wpisujesz obiekt. Przypisanie []do niej (lub w array()tamtym czasie) powoduje, że jest to tablica, którą można bezpiecznie wykorzystać jako tablicę.
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);

Jest obsługiwany w większości głównych przeglądarek.

Anurag
źródło
7
Fakt, że działa w Chrome, oznacza również, że działa w Node.js, ponieważ oba są zbudowane na silniku javascript V8.
Homme Zwaagstra
9
@fet Obecnie tak. Dwa lata temu, nie tak bardzo.
AlbertEngelB
4
Pamiętaj, że różni się to od for(key in ob)! Object.keysnie wymienia kluczy z prototypów, ale .. in objrobi to.
Albert
9
@fet windows7 przyszedł z IE8. Jakkolwiek wspaniale by to było, nie ma mowy, aby była to akceptowana odpowiedź, dopóki ludzie nie przestaną używać IE8.
przytula się
1
Tutaj developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... znajdziesz metodę JavaScript, która działa poprawnie w starych przeglądarkach i nie zastępuje funkcji w nowszych przeglądarkach. Zobacz także moją odpowiedź poniżej.
Sandro
27

Underscore.js sprawia, że ​​transformacja jest dość czysta:

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

Edycja: Stęskniłem się za tym, że możesz to zrobić:

var keys = _.keys(x);
mikebridge
źródło
Zgadza się, faktyczne źródło podkreślenia: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = funkcja (obj, klucz) {return hasOwnProperty.call (obj, klucz); }; _.keys = nativeKeys || function (obj) {if (obj! == Object (obj)) generuje nowy TypeError ('Nieprawidłowy obiekt'); var keys = []; for (var klucz w obj) if ( .has (obj, key)) keys.push (key); klucze powrotne; };
Miguel Alejandro Fuentes Lopez
18

Jeśli chcesz tylko kluczy specyficznych dla tego konkretnego obiektu, a nie żadnych pochodnych prototypewłaściwości:

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

na przykład:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
krio
źródło
4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

aby uzyskać dostęp do dowolnej wartości z obiektu, możesz użyć obj [klucz];

Mohan Gundlapalli
źródło
musisz zwiększyć indeks tablicy
Vivek
indeks tablicy jest zwiększany automatycznie o keys.length, co jest inne dla każdej iteracji, ponieważ każda iteracja wstawia wartość.
KrekkieD
4
obj = {'a':'c','b':'d'}

Możesz spróbować:

[index for (index in obj)] 

to zwróci:

['a','b']

aby uzyskać listę kluczy lub

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

aby uzyskać wartości

Jim Nolan
źródło
Nie działa w Google Chrome v16.0.912.75, ale działa w Firefox v10.0
RobM
4

Odpowiedź Anuragsa jest w zasadzie poprawna. Aby jednak obsługiwać również Object.keys(obj)starsze przeglądarki, możesz użyć poniższego kodu skopiowanego z https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Dodaje Object.keys(obj)metodę, jeśli nie jest dostępna w przeglądarce.

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
źródło
3

Zauważ, że w coffeescript można to zrobić we wszystkich przeglądarkach i węzłach as

k for k of obj

a zatem

(1 for _ of obj).length
Tim James
źródło
3

Rozwiązanie rekurencyjne dla przeglądarek obsługujących ECMAScript 5:

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
źródło
3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)
bajran
źródło
3

Jeśli zdecydujesz się użyć Underscore.js, lepiej

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
źródło
3

W JavaScript obiekt jest samodzielną jednostką o właściwościach i typie.

Do pobierania wartości z Object w postaci tablicy: Object .values ​​(obj) // obj to nazwa obiektu, którego użyłeś Wynik -> [„wartość1”, „wartość2”, „wartość3”, „wartość4”]

Do pobierania kluczy z Object w postaci tablicy: Object .keys (obj) // obj to nazwa obiektu, którego użyłeś Wynik -> [„klucz1”, „klucz2”, „klucz3”, „klucz4”]

Ponieważ obie funkcje zwracają tablicę, można uzyskać długość kluczy lub wartość za pomocą właściwości length. Na przykład - Object .values ​​(obj) .length lub Object .keys (obj) .length

Rakesh Soni
źródło
2

W przypadku łańcucha rozdzielanego przecinkami zawierającego listę kluczy obiektu JSON spróbuj wykonać następujące czynności:

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' */
chrześcijanin
źródło
2

Za pomocą ES6 można używać forEachdo iteracji po klawiszach obiektu. Aby uzyskać wszystkie klucze, możesz użyć, Object.keysktóry zwraca wszystkie klucze w obiekcie

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

Krótka ręka powyższego fragmentu będzie, która bierze tylko jeden parametr

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

za pomocą metody wycinania, stosowania i łączenia.

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

źródło