如何通过键获取Javascript对象的所有值?

时间:2016-04-27 08:35:35

标签: javascript arrays json object

我有一个带有一些键和值的Javascript对象:

var obj = { 
    "key1" : "val1", 
    "key2" : "val2", 
    "key3" : "val3", 
    "key4" : ""
}

我想迭代所有键并检索所有值。

我试过两种方法:

1)使用for(键中的var键)

var keys = Object.keys(obj);
for (var key in keys) {
    // ...
}

这个解决方案的问题是key对象是一个数组,所以我必须使用obj [keys [key]]]。 不是很漂亮。

此外,检查“key4”时,返回值为“0”而不是“”(空)。

2)使用forEach

Object.keys(obj).forEach(function(key){
    // ...
});

这种情况下的问题是,如果我尝试这样做:

Object.keys(obj).forEach(function(key){
    obj[key];  // <- obj is undefined !!
});

“obj”变量在foreach中未定义!

迭代所有键以检索所有值的最佳方法是什么?

由于

5 个答案:

答案 0 :(得分:7)

只需使用for in

var obj = { 
  "key1" : "val1", 
  "key2" : "val2", 
  "key3" : "val3", 
  "key4" : ""
};

for (var key in obj) {

  console.log(key); // key1 and etc...
  console.log(obj[key]); // val1 and etc...
}

答案 1 :(得分:6)

在您的第一个示例中,您使用for-in循环遍历数组,这通常不是一个好主意。要遍历数组,this answer为您提供了很多选项。

如果您要遍历所有对象的密钥,请在对象上使用for-in

for (var key in obj) {
    var value = obj[key];
    // ...
}

请注意,您既可以看到对象的拥有属性,也可以看到它从原型继承的属性。如果您只想要拥有属性,则可以添加一个警卫:

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        var value = obj[key];
        // ...
    }
}

...或者使用Object.keys(在2009年的ES5中引入,所以不在IE8上;如果你需要支持像IE8这样的过时浏览器,那就是一个垫片):

Object.keys(obj).forEach(function(key) {
    var value = obj[key];
    // ...
});

在这两种情况下,您只能获取对象的可枚举属性。如果您需要包含不可枚举的属性,请访问getOwnPropertyNames

Object.getOwnPropertyNames(obj).forEach(function(key) {
    var value = obj[key];
    // ...
});

这将获得对象自己的(不是继承的)属性名称,即使它们是不可枚举的,只要它们是字符串(它们总是在ES5及更早版本中;在ES2015及更高版本中,它们通常是字符串,但如果您使用Symbol s,也可以是Symbol个实例。

ES5中也引入了{p> getOwnPropertyNames,但我认为它无法填充,因此您无法在IE8或其他过时的浏览器中使用它。

答案 2 :(得分:0)

奇怪的是你有这个obj未定义的问题,它不应该发生。 除了其他答案之外,这是另一种方式。 只有当你不需要过滤某些内容而你只想拥有一个包含所有值(以及几行)的数组时,它才有用

var values = []
  Object.keys(object)
    .every( (prop) => values.push(object[prop]))

答案 3 :(得分:0)

我比第一种方法更喜欢第一种方法,但不需要单独存储密钥。让我们考虑这个例子:

# sample the data
q <- rnorm(n*p, mean=0, sd=1) #create the  matrix values from N(0,1)
x <- matrix(q, nrow=n, ncol=p)
e <- rnorm(n, mean=0, sd=1) # create error array
y <- x%*%beta1 + e # get the y values

#compute the coefficients LASSO
lasso <- glmnet(x,y)
lambda <- lasso$lambda.1se # selected lambda by cross-validation
beta.hat <- as.matrix(coef(lasso, s=0.34)) #get the estimate beta's
beta.hat <- beta.hat[2:(p+1),1] # delete intercept

如您所见,我们不需要阅读密钥。您可以出于任何目的使用此类function parseValues(obj, operation) { for (key in obj) { operation(obj[key], key); } } 。例如:

function

你可以用无数种方式来使用它。在第二种方法中,var myObject = {a: 1, b: 2, c: 3}; parseValues(myObject, function(item, key) { if (key !== "b") { if (item > 1) { myObject[key] = item * 2; } } }); 运行键,而不是运行您正在解析其键的对象。你需要使用forEach,正如T.J.Crowther已经指出的那样。

答案 4 :(得分:0)

使用ES6,Object.keys(obj).map(key => obj[key])将返回一个包含所有值的数组。