有没有比这更详细的方法了?
var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
keys.push(key);
}
#1 楼
使用Object.keys
: var foo = {
'alpha': 'puffin',
'beta': 'beagle'
};
var keys = Object.keys(foo);
console.log(keys) // ['alpha', 'beta']
// (or maybe some other order, keys are unordered).
这是ES5的功能。这意味着它适用于所有现代浏览器,但不适用于旧版浏览器。
ES5-shim具有可盗取的
Object.keys
的实现评论
注意:这仅适用于现代浏览器(因此,我的意思是IE <9)。
–火箭危险品
2012年1月6日19:21
那么移动浏览器呢?
– Marwen Trabelsi
2014年8月7日在8:15
@SmartyTwiti:我不确定。我认为它可以像Chrome或Firefox一样。
–火箭危险品
2014年8月7日在15:17
MDN也具有上述提到的Polyfill,但是注意到IE7中的错误,也许还有8,然后在这里引用了一个更短的Polyfill:tokenposts.blogspot.com.au/2012/04/…
–坎贝尔
15年1月21日在23:17
在实例出现之前,我尝试将键作为实例的属性进行调用的次数是静态类方法... api的理解-
– MrMesees
1月29日6:22
#2 楼
您可以使用jQuery的$.map
。var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' },
keys = $.map(foo, function(v, i){
return i;
});
评论
或者每个,如果您正在与他们一起做某事。 $ .each(foo,function(index,value){/ *用index * /}做某事);
–克里斯
1月27日18:07
#3 楼
当然,Object.keys()
是获取对象密钥的最佳方法。如果在您的环境中不可用,则可以使用示例中的代码对其进行简单填充(除非您需要考虑到循环将遍历原型链中的所有属性,这与Object.keys()
的行为不同)。 br /> 但是,您的示例代码...
var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
keys.push(key);
}
jsFiddle。
...可以修改。您可以直接在变量部分中进行赋值。
var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [], i = 0;
for (keys[i++] in foo) {}
jsFiddle。
当然,此行为与
Object.keys()
的实际行为不同(jsFiddle)。您可以简单地使用MDN文档上的填充程序。评论
我喜欢这个var keys = [],i = 0; for(foos中的key [i ++]){} +1
–贾斯旺特
13年2月1日在12:42
我听说“ for in”不能保证顺序,您知道Object.keys是否可以吗?
–克里斯·斯蒂芬斯(Chris Stephens)
13年5月13日在19:06
@ChrisStephens都不保证顺序,即使键最终位于有序数组中。
– alex
13年5月13日在23:49
当然,所有这些解决方案都需要hasOwnProperty()检查吗?
–不同步
14年7月13日在0:38
@TIMINeutron没有理由不应该:)
– alex
2014年12月18日在22:31
#4 楼
我不太详细,但我受到单线请求的启发而将以下内容强制转换为一行,但不知道它是如何使用Pythonic的;)var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo);
评论
也许应该是var enumerableKeysOnThePrototypeChain;)
– alex
13年5月13日在23:51
也许我们足够聪明,知道如果对象完全在我们的权限范围内创建而不是从其他地方导入,则不必担心hasOwnProperty
–Dexygen
16年1月21日在17:35
但是,它不像@alex的第二个答案(对于(foos中的(keys [i ++])){})一样Python化,因为您仍在执行Array.push()(更不用说声明整个函数了)。 pythonic实现应尽可能依赖于隐式理解,而使用lambda表达式则要失败。
–考伯特
17年9月28日在21:10
#5 楼
如果您在这里寻找将n深度嵌套对象的键作为平面数组列出的内容: const getObjectKeys = (obj, prefix = '') => {
return Object.entries(obj).reduce((collector, [key, val]) => {
const newKeys = [ ...collector, prefix ? `${prefix}.${key}` : key ]
if (Object.prototype.toString.call(val) === '[object Object]') {
const newPrefix = prefix ? `${prefix}.${key}` : key
const otherKeys = getObjectKeys(val, newPrefix)
return [ ...newKeys, ...otherKeys ]
}
return newKeys
}, [])
}
console.log(getObjectKeys({a: 1, b: 2, c: { d: 3, e: { f: 4 }}}))
#6 楼
摘要要获取对象的所有键,可以使用
Object.keys()
。 Object.keys()
接受一个对象作为参数并返回所有键的数组。示例:
const object = {
a: 'string1',
b: 42,
c: 34
};
const keys = Object.keys(object)
console.log(keys);
console.log(keys.length) // we can easily access the total amount of properties the object has
在上面的示例中,我们在键const中存储了一个键数组。然后,我们可以通过检查keys数组的长度来轻松访问对象上的属性数量。
通过以下方法获取值:
Object.values()
互补函数
Object.keys()
的值为Object.values()
。此函数将对象作为参数并返回值数组。例如: const object = {
a: 'random',
b: 22,
c: true
};
console.log(Object.values(object));
#7 楼
如果您决定使用Underscore.js,则最好var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
_.each( foo, function( val, key ) {
keys.push(key);
});
console.log(keys);
评论
为什么?有什么解释?
– Peter Mortensen
7月11日4:10
评论
除了添加if(foo.hasOwnProperty(key)),这就是我要做的。或者,使用$ .map。哦,不过要用Python的单线纸...
一个老问题,所以不值得一个完整的答案,但是对于那些想摆弄的人来说... jsfiddle.net/LR5D9/3这个解决方案处理的是在x循环中弄乱var的原型声明的问题
@unsynchronized请不要发布解决方案作为评论。您的评论故意违反了明确和故意的页面结构设计。