cara terbaik untuk mendapatkan kunci dari objek javascript kunci / nilai

186

Jika saya memiliki objek JS seperti:

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

Jika saya tahu yang foomemiliki struktur kunci / nilai dasar itu, tetapi tidak tahu nama kunci itu, apa cara termudah untuk mendapatkannya? for ... in? $.each()? Saya harap ada sesuatu yang lebih baik ....

Sprugman
sumber
5
apa yang salah dengan ... di?
Matt
1
Rasanya tidak langsung dan Anda harus menggunakan hasOwnProperty. Saya kira saya akan membuat fungsi perpustakaan yang melakukannya ....
sprugman

Jawaban:

93

Jika Anda ingin mendapatkan semua kunci, ECMAScript 5 diperkenalkanObject.keys . Ini hanya didukung oleh browser yang lebih baru tetapi dokumentasi MDC memberikan implementasi alternatif (yang juga menggunakan for...inbtw):

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

Tentu saja jika Anda menginginkan keduanya, kunci dan nilai, maka itu for...inadalah satu-satunya solusi yang masuk akal.

Felix Kling
sumber
pmemberi saya kunci tetapi bagaimana cara mendapatkan nilai kunci? Terima kasih.
Si8
1
Untuk kedua kunci dan nilai, gunakan Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… yang baru
Kzqai
mungkin ini merupakan indikasi dari pemahaman saya yang terbatas, tetapi jawaban ini tampaknya sangat bertele-tele (diakui dapat digunakan kembali) untuk sesuatu yang sederhana seperti mendapatkan kunci / nilai. Tidakkah seharusnya jawaban @Michael Benin ditandai sebagai yang terbaik?
Aaron Matthews
7
Erm ... apakah ada orang lain yang mengklik tautan pertama diarahkan ke narkotika anonim?
John Duskin
193

Anda akan beralih di dalam objek dengan for for:

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

Atau

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });
Michael Benin
sumber
Bagaimana jika saya tidak ingin foo[i]menjadi seperti itu "_proto_"?
user2284570
Bagaimana jika saya tidak ingin memberi tahu () foo[i]jika iada some string?
user2284570
@ user2284570: saya bisa menjadi string - tidak ada masalah.
Gerfried
bukankah maksud Anda (var i di Object.keys (foo)) {
samurai jack
103

Anda dapat mengakses setiap tombol satu per satu tanpa iterasi seperti pada:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
pengguna01
sumber
3
Anda sekarang dapat menggunakan operator spread untuk tujuan ini, terlihat lebih baik: const [firstKey, ...rest] = Object.keys(obj);
Nerlin
65

Diberikan Objek Anda:

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

Untuk mendapatkan bar, gunakan:

Object.keys(foo)[0]

Untuk mendapatkan baz, gunakan:

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

Dengan asumsi satu objek

Aryeh Beitz
sumber
27

Satu liner untuk Anda:

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
theonelucas
sumber
26

Ini adalah cara paling sederhana dan mudah. Inilah cara kami melakukan ini.

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 () adalah metode javascript yang mengembalikan array kunci ketika menggunakan objek.

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

Sekarang Anda dapat beralih pada objek dan dapat mengakses nilai-nilai seperti di bawah ini-

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})
Mustkeem K
sumber
Anda bisa mendapatkan TypeErrorjika Anda mengharapkan kunci menjadi nomor. Karena kunci selalu berupa string.
Hijau
15

Saya mengalami masalah yang sama dan inilah yang berhasil

//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;
Chris
sumber
11
mengapa tidak var value = person[key];? Dengan begitu Anda tidak perlu tahu kunci nilai yang ingin Anda tarik.
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"
}

Rujuk MDN

Aiffin
sumber
9

Saya tidak melihat hal lain selain itu for (var key in foo).

patapizza
sumber
5

Cara termudah adalah dengan menggunakan Underscore.js:

kunci

_.keys (objek) Ambil semua nama properti objek.

_.keys ({satu: 1, dua: 2, tiga: 3}); => ["satu", "dua", "tiga"]

Ya, Anda membutuhkan perpustakaan tambahan, tetapi sangat mudah!

samnau
sumber
4
@lonesomeday ya, tapi garis bawah / lodash berguna dalam banyak hal lain, jadi ada baiknya untuk dibesarkan.
jcollum
4

Tidak ada jalan lain selain itu for ... in. Jika Anda tidak ingin menggunakan itu (mungkin karena sedikit tidak efisien harus menguji hasOwnPropertypada setiap iterasi?) Kemudian gunakan konstruksi yang berbeda, misalnya array kvp:

[{ key: 'key', value: 'value'}, ...]
Jamie Treworgy
sumber
4

Karena Anda sebutkan $.each(), berikut ini adalah pendekatan praktis yang akan bekerja di jQuery 1.6+:

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

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

Object.keys () Metode Object.keys () mengembalikan array dari properti enumerable milik objek tertentu, dalam urutan yang sama dengan yang disediakan oleh for ... in loop (perbedaannya adalah for-in loop menyebutkan properti dalam rantai prototipe juga).

var arr1 = Object.keys(obj);

Object.values ​​() Metode Object.values ​​() mengembalikan array dari nilai properti enumerable milik objek tertentu, dalam urutan yang sama dengan yang disediakan oleh for ... in loop (perbedaannya adalah bahwa for-in loop enumerate properti dalam rantai prototipe juga).

var arr2 = Object.values(obj);

Untuk lebih lanjut silakan kunjungi di sini

jesusverma
sumber
3

gunakan untuk setiap loop untuk mengakses kunci di Object atau Maps di javascript

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
}

Catatan: Anda juga bisa menggunakan

Object.keys (foo);

itu akan memberi Anda seperti ini:

[batang];

jitendra varshney
sumber
1

Yah $.eachadalah membangun perpustakaan, sedangkan for ... injs asli, yang harus lebih baik

Naftali alias Neal
sumber
1

Anda dapat menggunakan fungsionalitas Object.keys untuk mendapatkan kunci seperti:

const tempObjects={foo:"bar"}

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

untuk ditampilkan sebagai string, cukup gunakan:

console.log("they are: " + JSON.stringify(foo));
Jiulong Zhao
sumber
0

cara terbaik untuk mendapatkan kunci / nilai objek.

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

Sahil Ralkar
sumber