我有一个带有一些键和值的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中未定义!
迭代所有键以检索所有值的最佳方法是什么?
由于
答案 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
个实例。
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])
将返回一个包含所有值的数组。