获取键/值javascript对象的键的最佳方法


183

如果我有一个JS对象,例如:

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

如果我知道foo键具有基本的键/值结构,但不知道键的名称,那么最简单的方法是什么?for ... in$.each()?我希望有更好的...


5
...在哪里有什么问题?
马特

1
感觉是间接的,您必须使用hasOwnProperty。我想我会做一个库函数,它它....
sprugman

Answers:


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
嗯...其他人单击第一个链接是否被重定向到匿名麻醉品?
约翰·杜斯金

191

您将使用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]如果isome string
user2284570

@ user2284570:我可以是字符串-没问题。
Gerfried

您的意思不是(var i in Object.keys(foo)){
武士杰克

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

假设一个对象


26

一个一个班轮为您提供:

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

25

这是最简单的方法。这就是我们的方法。

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



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

最简单的方法是只使用Underscore.js:

_.keys(object)检索对象属性的所有名称。

_.keys({一个:1,两个:2,2,三个:3}); => [“一个”,“两个”,“三个”]

是的,您需要一个额外的库,但这很简单!


4
@lonesomeday是的,但是下划线/破折号在许多其他方面很有用,因此值得一提。
jcollum 2013年

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

用于每个循环,以访问javascript中的Object或Maps中的键

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

它会给你这样的输出:

[酒吧];




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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.