JavaScript nesne anahtar listesini alma


296

Gibi bir JavaScript nesnem var

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

Bu nesnedeki anahtarların uzunluğunu ve listesini nasıl alabilirim?



@TJ Bence tamamen aynı değil. Bu bir nesnedir, yinelenen bir JSON nesnesidir.
GuyT

alt çizginiz varsa, o zaman _.keys (your_object)
minhajul

1
2010 yılından bu yana işler değiştikçe, en çok yanıtlanan cevabı "cevap" olarak kabul etmek daha iyi olabilir
Jonas Wilms

Yanıtlar:


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


Javascript PHP gibi, ilk satırı tamamen atlayabilirsiniz nerede sanmıyorum? Böyle bir şeyin zaten yapılması tavsiye edilmez.
Bart van Heukelom

@Bart: Hayır, JavaScript'te ilk satır zorunludur.
Daniel Vassallo

6
Burada bir uç dava için David Morrissey'in aşağıdaki yorumuna bir göz atmalısınız. Bazen bu yaklaşımı kullanmak, prototipin istenmeyen üyelerinin ortaya çıkmasına neden olabilir keys.

2
@pat: Nesne değişmez değerleri kullanıyorsanız, bu yalnızca genişletirseniz olur ve Object.prototypezaten yapmamanız gerekir. Ancak özel yapımcılar için haklısınız.
Sasha Chedygov

@BartvanHeukelom bile Haziran 2010'da bir bildirime neden oldu, çünkü nesneyi dolaylı olarak yazdığınız anlamına geliyor. []Ona (veya array()o zamana) atamak onu bir dizi yapar, bu dizi daha sonra güvenli bir dizi olarak kullanabilirsiniz.
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);

Şu anda çoğu büyük tarayıcıda desteklenmektedir .


7
Chrome'da çalışması, her ikisi de V8 javascript motorunda oluşturulduğu için Node.js'de de çalıştığı anlamına gelir.
Homme Zwaagstra

9
@fet Bugünlerde, evet. İki yıl önce, çok fazla değil.
AlbertEngelB

4
Bunun farklı olduğunu unutmayın for(key in ob)! Object.keysprototiplerin anahtarlarını listelemez, ama .. in objyapar.
Albert

9
@fet windows7 IE8 ile geldi. Ne kadar büyük olursa olsun, insanlar IE8'i kullanmayı bırakana kadar kabul edilen cevap bu olamaz.
sokulur

1
Burada developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… eski tarayıcılarda düzgün çalışan ve daha yeni tarayıcılarda işlevselliğin üzerine yazılmayan bir JavaScript yöntemi bulursunuz. Aşağıdaki cevabımı da görebilirsiniz.
Sandro

27

Underscore.js dönüşümü oldukça temiz hale getiriyor:

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

Düzenleme: Bunu da yapabileceğinizi özledim:

var keys = _.keys(x);

Doğru, gerçek alt çizgi kaynağı: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, anahtar); }; _.keys = nativeKeys || function (obj) {if (obj! == Nesne (obj)) yeni TypeError ('Geçersiz nesne') atın; var tuşları = []; ( .has (obj, anahtar)) keys.push (anahtar) ise, (var anahtarında obj ); dönüş tuşları; };
Miguel Alejandro Fuentes Lopez

18

Türetilmiş prototypeözelliklerin değil, yalnızca belirli bir nesneye özgü anahtarların olmasını istiyorsanız :

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

Örneğin:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

nesneden herhangi bir değere erişmek için obj [key] kullanabilirsiniz;


dizi endeksini
artırmanız

dizi dizini otomatik olarak artırılır keys.lengthve her yineleme bir değer eklediğinden her yineleme için farklıdır.
KrekkieD

4
obj = {'a':'c','b':'d'}

Deneyebilirsin:

[index for (index in obj)] 

bu geri dönecektir:

['a','b']

tuşların listesini almak için veya

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

değerleri almak


Google Chrome v16.0.912.75'te çalışmaz, ancak Firefox
v10.0

4

Anurags cevabı temel olarak doğrudur. Ancak Object.keys(obj)eski tarayıcılarda da destek olmak için https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys adresinden kopyalanan aşağıdaki kodu kullanabilirsiniz . Object.keys(obj)Tarayıcıda mevcut değilse yöntemi ekler .

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

3

Coffeescript'te bunun tüm tarayıcılarda ve düğümlerde gerçekleştirilebileceğini unutmayın.

k for k of obj

ve böylece

(1 for _ of obj).length

3

ECMAScript 5'i destekleyen tarayıcılar için özyinelemeli çözüm:

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

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

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

Underscore.js kullanmaya karar verirseniz,

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

3

JavaScript'te bir nesne, özellikleri ve türü olan bağımsız bir varlıktır.

Nesne'den dizi biçimindeki değerleri almak için: Object .values ​​(obj) // obj, kullandığınız nesne adıdır Sonuç -> ["değer1", "değer2", "değer3", "değer4"]

Object öğesinden dizi biçimindeki anahtarları getirmek için: Object .keys (obj) // obj, kullandığınız nesne adıdır Sonuç -> ["key1", "key2", "key3", "key4"]

Her iki işlev de dizi döndürürken, length özelliğini kullanarak anahtarların veya değerin uzunluğunu elde edebilirsiniz. Örneğin - Object .values ​​(obj) .length veya Object .keys (obj) .length


2

JSON Nesnesinin anahtarlarını listeleyen virgülle tanımlanmış bir dize için aşağıdakileri deneyin:

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' */

2

ES6'yı kullanarak forEach, bir Nesnenin Tuşları üzerinde yineleme yapmak için kullanabilirsiniz . Bir nesnedeki tüm anahtarları Object.keysdöndüren tüm anahtarları almak için kullanabilirsiniz

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

Yukarıdaki pasajın kısa eli, sadece bir parametre alır

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

1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }

0

dilim kullanarak, uygulamak ve katılmak yöntemi.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.