Bir anahtar / değer javascript nesnesinin anahtarını almanın en iyi yolu


186

Ben gibi bir JS nesnesi varsa:

var foo = { 'bar' : 'baz' }

fooBunun temel anahtar / değer yapısına sahip olduğunu biliyorum , ancak anahtarın adını bilmiyorsam, onu almanın en kolay yolu nedir? for ... in? $.each()? Umarım daha iyi bir şey vardır ....


5
... için neyin yanlış?
Matt

1
Dolaylı geliyor ve hasOwnProperty'yi kullanmanız gerekiyor. Sanırım bunu yapan bir kütüphane işlevi yapacağım ....
sprugman

Yanıtlar:


93

Tüm anahtarları almak istiyorsanız, ECMAScript 5 kullanıma sunulduObject.keys . Bu yalnızca yeni tarayıcılar tarafından desteklenir, ancak MDC belgeleri alternatif bir uygulama sağlar ( for...inbtw da kullanır ):

if(!Object.keys) Object.keys = function(o){
     if (o !== Object(o))
          throw new TypeError('Object.keys called on non-object');
     var ret=[],p;
     for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
     return ret;
}

Tabii ki, hem anahtar hem de değer istiyorsanız, o zaman for...intek makul çözümdür.


pbana anahtarı veriyor ama anahtarın değerini nasıl alabilirim? Teşekkürler.
Si8

1
Hem anahtarlar hem de değerler için, yeni Object.entries () developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Kzqai

belki de bu sınırlı anlayışımın bir göstergesidir, ancak bu cevap bir anahtar / değer elde etmek kadar basit bir şey için inanılmaz derecede ayrıntılı (kuşkusuz yeniden kullanılabilir) gibi görünüyor. @Michael Benin yanıtı en iyisi olarak işaretlenmemeli mi?
Aaron Matthews

7
Eee ... ilk bağlantıyı tıklayan herkes anonim narkotiklere yönlendiriliyor mu?
John Duskin

193

Bir for döngüsü ile nesnenin içinde yineleme yaparsınız:

for(var i in foo){
  alert(i); // alerts key
  alert(foo[i]); //alerts key's value
}

Veya

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });

foo[i]Olmak istemezsem ne olur "_proto_"?
user2284570


Ben uyarı ne istemiyorsanız () foo[i]eğer iolduğunu some string?
user2284570

@ user2284570: i bir dize olabilir - sorun değil.
Gerfried

için demek istemiyor musunuz (Object.keys (foo) içinde var i) {
samurai jack

103

Her anahtara aşağıdaki gibi tekrarlamadan ayrı ayrı erişebilirsiniz:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second

3
Artık bu amaçla const [firstKey, ...rest] = Object.keys(obj);
forma

65

Nesneniz verildiğinde:

var foo = { 'bar' : 'baz' }

Almak için şunu barkullanın:

Object.keys(foo)[0]

Almak için şunu bazkullanın:

foo[Object.keys(foo)[0]]

Tek bir nesne varsayarsak


27

Bir tek astar sizin için:

const OBJECT = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
    'key4': 'value4'
};

const value = 'value2';

const key = Object.keys(OBJECT)[Object.values(OBJECT).indexOf(value)];

window.console.log(key); // = key2

26

Bu en basit ve kolay yoldur. Bunu böyle yapıyoruz.

var obj = { 'bar' : 'baz' }
var key = Object.keys(obj)[0];
var value = obj[key];
     
 console.log("key = ", key) // bar
 console.log("value = ", value) // baz
Object.keys (), nesnelerde kullanırken bir dizi anahtar döndüren javascript yöntemidir.

Object.keys(obj) // ['bar']

Artık nesneler üzerinde yineleme yapabilir ve aşağıdaki gibi değerlere erişebilirsiniz.

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})

Sen alabilirsiniz TypeErrorEğer bir tuşa bir numara olmasını bekliyoruz eğer. Çünkü anahtarlar her zaman dizgidir.
Yeşil

15

Aynı sorunu yaşıyordum ve işte bu işe yaradı

//example of an Object
var person = {
    firstName:"John",
    lastName:"Doe",
    age:50,
    eyeColor:"blue"
};

//How to access a single key or value
var key = Object.keys(person)[0];
var value = person.firstName;

11
neden olmasın var value = person[key];? Bu şekilde, çekmek istediğiniz değerin anahtarını bilmek zorunda kalmazsınız.
Sean Kendle

14
// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}

MDN'ye bakın



5

En kolay yol sadece Underscore.js'yi kullanmaktır:

anahtarlar

_.keys (object) Nesnenin özelliklerinin tüm adlarını alır.

_.keys ({bir: 1, iki: 2, üç: 3}); => ["bir", "iki", "üç"]

Evet, fazladan bir kütüphaneye ihtiyacınız var ama çok kolay!


4
@lonesomeday evet, ancak alt çizgi / lodash başka birçok açıdan yararlıdır, bu yüzden ortaya çıkmaya değer.
jcollum

4

Bundan başka yolu yok for ... in. Bunu kullanmak istemiyorsanız (belki hasOwnPropertyde her yinelemeyi test etmek için marjinal olarak verimsiz olduğu için ?) Farklı bir yapı kullanın, örneğin bir dizi kvp's:

[{ key: 'key', value: 'value'}, ...]

4

Bahsettiğinizden bu yana $.each(), jQuery 1.6+ ile çalışacak kullanışlı bir yaklaşım:

var foo = { key1: 'bar', key2: 'baz' };

// keys will be: ['key1', 'key2']
var keys = $.map(foo, function(item, key) {
  return key;
});

4

Object.keys () Object.keys () yöntemi, belirli bir nesnenin kendi numaralandırılabilir özelliklerinin bir dizisini, for ... in döngüsü tarafından sağlananla aynı sırada döndürür (fark, bir for-in döngüsünün özellikleri numaralandırmasıdır) prototip zincirinde de).

var arr1 = Object.keys(obj);

Object.values ​​() Object.values ​​() yöntemi, belirli bir nesnenin kendi numaralandırılabilir özellik değerlerinin bir dizisini for for in döngüsü tarafından sağlananla aynı sırada döndürür (fark, bir for-in döngüsünün numaralandırmasıdır prototip zincirindeki özellikler).

var arr2 = Object.values(obj);

Daha fazlası için lütfen buraya gidin


3

JavaScript'teki Nesne veya Haritalar'daki anahtarlara erişmek için her döngü için kullanın

for(key in foo){
   console.log(key);//for key name in your case it will be bar
   console.log(foo[key]);// for key value in your case it will be baz
}

Not: ayrıca kullanabilirsiniz

Object.keys (foo);

size bu çıktıyı verecektir:

[bar];


1

İyi $.eachbir kütüphane yapısı ise, bir for ... indaha iyi olmalı doğal js, olduğu


1

Aşağıdaki gibi anahtarları almak için Object.keys işlevini kullanabilirsiniz:

const tempObjects={foo:"bar"}

Object.keys(tempObjects).forEach(obj=>{
   console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});

0

dize olarak göstermek için şunu kullanın:

console.log("they are: " + JSON.stringify(foo));

0

nesnenin anahtarını / değerini almanın en iyi yolu.

let obj = {
        'key1': 'value1',
        'key2': 'value2',
        'key3': 'value3',
        'key4': 'value4'
    }
    Object.keys(obj).map(function(k){ 
    console.log("key with value: "+k +" = "+obj[k])    
    
    })
    

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.