我正在创建一个JavaScript对象并指定一个动态的键。所以键中可能有空格。我可以在浏览器控制台中看到对象,如下所示,
{barTitle: 'Cash Flow', Cash Flow: 90254}
当我按如下方式遍历对象时,
Object.keys(obj).forEach(function(key) {
console.log(key, obj[key]);
});
我得到以下结果,
barTitle Alrais
undefined
在浏览器控制台中。如何在上述情况下访问密钥(请注意,该对象是动态的,我不知道密钥。如果知道密钥,那么我可以像obj['Cash Flow']
那样访问它?)
答案 0 :(得分:1)
这里有三种可能性:
“现金流”属性是继承的,或
“现金流量”属性不可枚举,或
两者。 : - )
Object.keys
仅为您提供对象的可枚举,拥有属性的名称。跳过继承的和不可枚举的。
您可以使用for-in
访问所有可枚举属性,包括继承的属性:
var proto = {"Cash Flow": 90254};
var obj = Object.create(proto);
obj.barTitle = 'Cash Flow';
// Doesn't show
Object.keys(obj).forEach(function(key) {
console.log(key, obj[key]);
});
console.log("----");
// Shows:
for (var key in obj) {
console.log(key, obj[key]);
}
您可以使用Object.getOwnPropertyNames
获取对象的所有“拥有”属性,包括不可枚举的属性(这是ES5 [2009]中的新内容):< / p>
var obj = {barTitle: "Cash Flow"};
Object.defineProperty(obj, "Cash Flow", {
value: 90254
});
// Doesn't show
Object.keys(obj).forEach(function(key) {
console.log(key, obj[key]);
});
console.log("----");
// Shows:
Object.getOwnPropertyNames(obj).forEach(function(key) {
console.log(key, obj[key]);
});
如果您需要具有字符串名称的所有属性,包括继承的非可枚举属性,则可以轻松地将Object.getOwnPropertyNames
与Object.getPrototypeOf
(ES2015中的新内容)组合以构建循环:
var proto = {};
Object.defineProperty(proto, "Cash Flow", {
value: 90254
});
var obj = Object.create(proto);
obj.barTitle = "Cash Flow";
// Doesn't show
Object.keys(obj).forEach(function(key) {
console.log(key, obj[key]);
});
console.log("----");
// Shows:
getAllPropertyNames(obj).forEach(function(key) {
console.log(key, obj[key]);
});
function getAllPropertyNames(obj) {
var names = Object.create(null);
var p = obj;
while (p && p !== Object.prototype) {
Object.getOwnPropertyNames(p).forEach(function(name) {
names[name] = true;
});
p = Object.getPrototypeOf(p);
}
return Object.keys(names);
}
在那,我假设你不想看到Object.prototype
的属性,所以如果它在对象的原型链中,我们就提前停止。
另请注意,我假设您对符号命名的属性不感兴趣。如果是,请使用Object.getOwnPropertySymbols
访问它们。