如果我有一个像这样的对象:
var o = {a:1,b:2,c:3};
我想得到:
['a','b','c'];
我想使用for (var i in o)
,因为这将包含原型链中的属性。如果我不需要原型链中的属性,我可以使用Object.keys(o)
。
我以为我可以在这里使用一些Array.prototype.*
方法。就像map
一样,但这对我来说太先进了。
我可以从循环中创建一个字符串并进行拆分。但这样做有效率和专业水平吗?
答案 0 :(得分:4)
您可以在lodash https://lodash.com/docs#keys
中使用keys方法您还可以使用以下代码
var arr = [];
var o = {a:1,b:2}
for(k in o) { arr.push(k); }
这是另一个深入到对象
的版本function getKeys(o) { var arr = []; for(k in o) { arr.push(k); if(typeof(o[k]) === 'object') { arr.push(getKeys(o[k])); }} return arr; }
如果你有像{a:1,b:2,c:{d:1,e:2}}这样的对象,你会收到['a','b','c',[ 'd', 'E']
完全平坦的版本就是这个
function getKeys(o) { var arr = []; for(k in o) { arr.push(k); if(typeof(o[k]) === 'object') { for(j of getKeys(o[k])){ arr.push(j); } }} return arr; }
答案 1 :(得分:0)
如果您有以下哈希
var o = {a:1,b:2,c:3};
创建一个新的空数组来存储密钥
var array_keys = new Array();
然后使用for循环将键推入数组
for (var key in o) {
array_keys.push(key);
}
然后您可以运行alert(array_keys)
答案 2 :(得分:0)
这是一个避免你提到的for...in
的解决方案。但是,我认为for...in
解决方案更加优雅。
这将遍历原型链并将所有属性作为递归函数返回。除了删除所有重复项。
function getKeys(obj) {
var keys = Object.keys(obj);
var parent = Object.getPrototypeOf(obj);
if (!parent) {
return keys;
}
return keys.concat(getKeys(parent))
.filter(function (item, index, col) {
return col.indexOf(item) === index;
});
}
var a = { a: 1, b: 2 };
var b = Object.create(a);
b.a = 2;
b.c = 3;
var c = Object.create(b);
console.log(getKeys(c));