najlepszy sposób na uzyskanie klucza obiektu javascript klucz / wartość

185

Jeśli mam obiekt JS, taki jak:

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

Jeśli wiem, że fooma tę podstawową strukturę klucz / wartość, ale nie znam nazwy klucza, jaki jest najłatwiejszy sposób na zdobycie go? for ... in? $.each()? Mam nadzieję, że jest coś lepszego ....

sprugman
źródło
5
co jest nie tak z… wejściem?
Matt
1
Wydaje się pośredni i musisz użyć hasOwnProperty. Myślę, że
utworzę

Odpowiedzi:

93

Jeśli chcesz uzyskać wszystkie klucze, wprowadzono ECMAScript 5Object.keys . Jest to obsługiwane tylko przez nowsze przeglądarki, ale dokumentacja MDC zapewnia alternatywną implementację (która wykorzystuje również 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;
}

Oczywiście, jeśli chcesz zarówno klucz, jak i wartość, for...injest to jedyne rozsądne rozwiązanie.

Felix Kling
źródło
pdaje mi klucz, ale jak mogę uzyskać wartość klucza? Dzięki.
Si8,
1
Zarówno dla kluczy, jak i wartości, użyj nowego Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kzqai
być może jest to przejaw mojego ograniczonego zrozumienia, ale ta odpowiedź wydaje się niezwykle pełna (co prawda wielokrotnego użytku) dla czegoś tak prostego, jak uzyskanie klucza / wartości. Czy odpowiedź @ Michaela Benina nie powinna być oznaczona jako najlepsza?
Aaron Matthews,
7
Erm ... czy ktoś klikający pierwszy link zostaje przekierowany na anonimowy narkotyk?
John Duskin
193

Powtarzalibyśmy wewnątrz obiektu za pomocą pętli for:

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

Lub

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });
Michael Benin
źródło
Co jeśli nie chcę foo[i]być "_proto_"?
user2284570
Co jeśli nie chcę powiadamiać (), foo[i]jeśli ijest some string?
user2284570
@ user2284570: Mogę być ciągiem - nie ma problemu.
Gerfried
nie masz na myśli (var i w Object.keys (foo)) {
samurai jack
103

Możesz uzyskać dostęp do każdego klucza osobno, bez iteracji jak w:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
użytkownik01
źródło
3
Możesz teraz użyć do tego celu operatora rozkładania, wygląda lepiej: const [firstKey, ...rest] = Object.keys(obj);
Nerlin,
65

Biorąc pod uwagę twój obiekt:

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

Aby uzyskać bar, użyj:

Object.keys(foo)[0]

Aby uzyskać baz, użyj:

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

Zakładając pojedynczy obiekt

Aryeh Beitz
źródło
27

Jedna wkładka dla Ciebie:

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

To najprostszy i najłatwiejszy sposób. Tak to robimy.

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 () to metoda javascript, która zwraca tablicę kluczy podczas używania na obiektach.

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

Teraz możesz iterować obiekty i uzyskiwać dostęp do wartości takich jak poniżej-

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})
Mustkeem K
źródło
Możesz dostać, TypeErrorjeśli oczekujesz, że klucz będzie liczbą. Ponieważ klucze są zawsze łańcuchami.
Zielony
15

Miałem ten sam problem i to działało

//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
źródło
11
dlaczego nie var value = person[key];? W ten sposób nie musisz znać klucza wartości, którą chcesz pobrać.
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"
}

Patrz MDN

aiffin
źródło
9

Nic więcej nie widzę for (var key in foo).

patapizza
źródło
5

Najprostszym sposobem jest użycie Underscore.js:

Klucze

_.keys (obiekt) Pobierz wszystkie nazwy właściwości obiektu.

_.klucze ({jeden: 1, dwa: 2, trzy: 3}); => [„jeden”, „dwa”, „trzy”]

Tak, potrzebujesz dodatkowej biblioteki, ale to takie proste!

samnau
źródło
4
@lonesomeday tak, ale podkreślenie / lodash są przydatne na wiele innych sposobów, więc warto je omówić.
jcollum,
4

Nie ma innej drogi niż for ... in. Jeśli nie chcesz tego używać (być może dlatego, że testowanie hasOwnPropertyprzy każdej iteracji jest nieznacznie nieefektywne ?), Użyj innej konstrukcji, np. Tablicy kvp:

[{ key: 'key', value: 'value'}, ...]
Jamie Treworgy
źródło
4

Jak już wspomniałeś $.each(), oto przydatne podejście, które zadziałałoby w 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
źródło
4

Object.keys () Metoda Object.keys () zwraca tablicę własnych wyliczalnych właściwości danego obiektu, w tej samej kolejności, jaką zapewnia pętla for ... in (różnica polega na tym, że pętla for-in wylicza właściwości również w łańcuchu prototypów).

var arr1 = Object.keys(obj);

Object.values ​​() Metoda Object.values ​​() zwraca tablicę wartości własnych wyliczalnych właściwości danego obiektu, w takiej samej kolejności, jak w pętli for ... in (różnica polega na tym, że wyliczana jest pętla for-in właściwości również w łańcuchu prototypów).

var arr2 = Object.values(obj);

Aby uzyskać więcej, przejdź tutaj

jesusverma
źródło
3

użyj dla każdej pętli, aby uzyskać dostęp do kluczy w Object lub Maps w 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
}

Uwaga: możesz także użyć

Object.keys (foo);

da ci to wynik:

[bar];

jitendra varshney
źródło
1

Cóż, $.eachto konstrukcja biblioteki, podczas gdy for ... innatywna js, co powinno być lepsze

Naftali alias Neal
źródło
1

Możesz użyć funkcji Object.keys, aby uzyskać klucze takie jak:

const tempObjects={foo:"bar"}

Object.keys(tempObjects).forEach(obj=>{
   console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});
Akarsh Srivastava
źródło
0

do wyświetlania jako ciąg znaków wystarczy użyć:

console.log("they are: " + JSON.stringify(foo));
Jiulong Zhao
źródło
0

najlepszy sposób na uzyskanie klucza / wartości obiektu.

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