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 ....


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.


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

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

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


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

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

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;

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



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!


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'}, ...]

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

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


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



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

0

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

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

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])    
    
    })
    

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.