将对象键转换为数组列表?

时间:2015-03-06 17:48:23

标签: javascript arrays

如果我有一个像这样的对象:

var o = {a:1,b:2,c:3};

我想得到:

['a','b','c'];

我想使用for (var i in o),因为这将包含原型链中的属性。如果我不需要原型链中的属性,我可以使用Object.keys(o)

我以为我可以在这里使用一些Array.prototype.*方法。就像map一样,但这对我来说太先进了。

我可以从循环中创建一个字符串并进行拆分。但这样做有效率和专业水平吗?

3 个答案:

答案 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));