лучший способ получить ключ объекта javascript ключ / значение

186

Если у меня есть объект JS, как:

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

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

sprugman
источник
5
что не так с ... в?
Мэтт
1
Это кажется косвенным, и вы должны использовать hasOwnProperty. Я думаю, я сделаю библиотечную функцию, которая делает это ....
sprugman

Ответы:

93

Если вы хотите получить все ключи, ECMAScript 5 введенObject.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_"?
user2284570
Что делать, если я не хочу предупреждать (), foo[i]если iесть some string?
user2284570
@ user2284570: я могу быть строкой - нет проблем.
Герфрид
Разве вы не имеете в виду (var я в Object.keys (Foo)) {
Самурай Джек
103

Вы можете получить доступ к каждому ключу индивидуально, не повторяя, как в:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
user01
источник
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
theonelucas
источник
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
})
Mustkeem K
источник
Вы можете получить, 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

aiffin
источник
9

Я не вижу ничего, кроме for (var key in foo).

patapizza
источник
5

Самый простой способ - просто использовать Underscore.js:

ключи

_.keys (объект) Получить все имена свойств объекта.

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

Да, вам нужна дополнительная библиотека, но это так просто!

samnau
источник
4
@ lonesomeday да, но подчеркивание / lodash полезно во многих других отношениях, так что стоит упомянуть.
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);

Для получения дополнительной информации, пожалуйста, перейдите сюда

jesusverma
источник
3

использовать для каждого цикла для доступа к ключам в объекте или карты в 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

Ну $.each, это конструкция библиотеки, в то время for ... inкак нативный JS, который должен быть лучше

Нафтали ака Нил
источник
1

Вы можете использовать функциональность Object.keys для получения ключей, таких как:

const tempObjects={foo:"bar"}

Object.keys(tempObjects).forEach(obj=>{
   console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});
Акарш Шривастава
источник
0

для отображения в виде строки просто используйте:

console.log("they are: " + JSON.stringify(foo));
Цзюлун Чжао
источник
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])    
    
    })
    

Сахил Ралкар
источник