如何捕获数组内的对象键

时间:2016-02-11 11:31:37

标签: javascript

我在迭代父数组时使用Object.keys()获取对象键,如下所示。我想知道是否有其他方法来捕获对象密钥,如果我知道只有一个。 arrOfObjs[i][keyArr[0]]让我很头疼。

var arrOfObjs = [
    {"key1":"val1"},
    {"key2":"val2"},
    {"key3":"val3"},    
]
for(var i in arrOfObjs){
    var keyArr = Object.keys(arrOfObjs[i]);
    console.log(keyArr[0], arrOfObjs[i][keyArr[0]]);
}

3 个答案:

答案 0 :(得分:1)

前言:不要像在你的例子中那样使用for-in循环数组,至少除非你确定你在做什么,否则不要。有关循环数组的更多信息in this answer

  

我想知道是否有其他方法来捕获对象密钥,如果我知道只有一个。

Object.keys(obj)[0]获取对象中唯一拥有的可枚举属性名称的短版本。但如果[0]困扰你,你可以提早做到:

for(var i in arrOfObjs){ // See note above, don't use for-in here
    var keyArr = Object.keys(arrOfObjs[i])[0];
    // Note ------------------------------^^^
    console.log(keyArr, arrOfObjs[i][keyArr]);
}

可以这样做:

for(var i in arrOfObjs){ // See note above, don't use for-in here
    for (var key in arrOfObjs[i]) {
        console.log(key, arrOfObjs[i][key]);
        break; // You've said you know there's only one, but...
    }
}

...但除了(我猜)避免调用Object.keys之外,它不会给你买任何东西,实际上你的Object.keys代码会过滤掉继承的属性,这可能很有用(尽管它是有用的)在你的例子中没有必要)。

示例中的对象没有任何继承属性(除非有人使用Object.prototype做了些事情),但要完全等同于Object.keys示例,我们必须投入另一个函数调用:

for(var i in arrOfObjs){ // See note above, don't use for-in here
    for (var key in arrOfObjs[i]) {
        if (arrOfObj[i].hasOwnProperty(key)) {
            console.log(key, arrOfObjs[i][key]);
            break; // You've said you know there's only one, but...
        }
    }
}

事实上,要完全完全,我们必须走得更远:

for(var i in arrOfObjs){ // See note above, don't use for-in here
    for (var key in arrOfObjs[i]) {
        if (Object.prototype.hasOwnProperty.call(arrOfObj[i], key)) {
            console.log(key, arrOfObjs[i][key]);
            break; // You've said you know there's only one, but...
        }
    }
}

答案 1 :(得分:-1)

好吧,我不介意[0],我会首先删除for循环。 像:

  

var arrOfKeys = arrOfObjs.map((obj)=> Object.keys(obj)[0])

答案 2 :(得分:-1)

您可以使用 Underscore.js

以非常干净的方式做到这一点
var keys = _.map(arrOfObjs, function(v, k) { return k; });