найкращий спосіб отримати ключ об’єкта JavaScript / ключ


185

Якщо у мене є об'єкт JS на зразок:

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

Якщо я знаю, що fooмає таку основну структуру ключа / значення, але не знаю назви ключа, який найпростіший спосіб отримати його? for ... in? $.each()? Я сподіваюся, що є щось краще….


5
з чим не так ... в?
Метт

1
Це непрямо, і вам доведеться використовувати hasOwnProperty. Я думаю, я зроблю функцію бібліотеки, яка це робить ....
спругман

Відповіді:


93

Якщо ви хочете отримати всі ключі, запроваджено ECMAScript 5Object.keys . Це підтримується лише новішими браузерами, але документація MDC забезпечує альтернативну реалізацію (яка також використовує 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;
}

Звичайно, якщо ви хочете і те, і інше, і ключ, і значення, то for...inце єдине розумне рішення.


pдає мені ключ, але як я можу отримати значення ключа? Дякую.
Si8

1
Як для ключів, так і для значень використовуйте новий Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kzqai

Можливо, це є ознакою мого обмеженого розуміння, але ця відповідь здається неймовірно багатослівною (правда, багаторазовою) для чогось такого простого, як отримання ключа / значення. Чи не слід відповідати @Michael Benin як найкращу?
Аарон Меттьюз

7
Ем ... хтось, хто натиснув перше посилання, перенаправляється на анонімні наркотики?
Джон

193

Ви б повторили всередині об'єкта циклом for:

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

Або

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

Що робити, якщо я не хочу foo[i]бути "_proto_"?
користувач2284570


Що робити, якщо я не хочу оповіщати (), foo[i]якщо iє some string?
користувач2284570

@ user2284570: я можу бути рядком - немає проблем.
Герфрід

ви не маєте на увазі (var i в Object.keys (foo)) {
samurai jack

103

Ви можете отримати доступ до кожної клавіші окремо без повторення, як у:

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

3
Тепер ви можете використовувати для цього оператор розповсюдження, це виглядає краще: const [firstKey, ...rest] = Object.keys(obj);
Nerlin

65

З огляду на ваш об’єкт:

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

Щоб отримати bar, скористайтеся:

Object.keys(foo)[0]

Щоб отримати baz, скористайтеся:

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

Припускаючи один об'єкт


27

Один лайнер для вас:

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

Це найпростіший і легкий спосіб. Ось як ми це робимо.

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 () - метод javascript, який повертає масив ключів при використанні на об'єктах.

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

Тепер ви можете переглядати об’єкти та отримувати доступ до значень, як нижче-

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

Ви можете отримати, TypeErrorякщо очікуєте, що ключем буде номер. Тому що клавіші - це завжди рядки.
Зелений

15

У мене була така ж проблема, і це те, що спрацювало

//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
чому ні var value = person[key];? Таким чином, вам не потрібно знати ключ значення, яке ви хочете отримати.
Шон Кендл

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



5

Найпростіший спосіб - просто скористатися Underscore.js:

ключі

_.keys (об'єкт) Отримайте всі назви властивостей об'єкта.

_.keys ({один: 1, два: 2, три: 3}); => ["один", "два", "три"]

Так, вам потрібна додаткова бібліотека, але це так просто!


4
@lonesomeday так, але підкреслення / подача корисні багатьма іншими способами, тому варто підняти їх.
jcollum

4

Іншого шляху немає for ... in. Якщо ви не хочете використовувати це (парпас, оскільки це неефективно мати тест hasOwnPropertyна кожній ітерації?), То використовуйте іншу конструкцію, наприклад масив kvp:

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

4

Оскільки ви згадали $.each(), ось зручний підхід, який би працював у 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 () Метод Object.keys () повертає масив власних перелічуваних властивостей даного об'єкта в тому ж порядку, що і в циклі for ... in (різниця полягає в тому, що цикл for-in перераховує властивості і в ланцюзі прототипу).

var arr1 = Object.keys(obj);

Object.values ​​() Метод Object.values ​​() повертає масив власних перелічених значень властивостей даного об'єкта в тому ж порядку, що і в циклі for ... in (різниця полягає в тому, що перераховується цикл for-in властивості в прототипі також).

var arr2 = Object.values(obj);

Для отримання більш детальної інформації просимо сюди


3

використовувати для кожного циклу для доступу до клавіш в Object або Maps в 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
}

Примітка: ви також можете використовувати

Object.keys (foo);

він дасть вам такий вихід:

[бар];



1

Ви можете використовувати функцію Object.keys, щоб отримати ключі, наприклад:

const tempObjects={foo:"bar"}

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


0

найкращий спосіб отримати ключ / значення об'єкта.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.