JavaScript:获取对象的第一个也是唯一的属性名称

时间:2011-07-20 17:22:43

标签: javascript object properties

如果我想枚举对象的属性并想要忽略原型,我会使用:

var instance = { ... };

for (var prop in instance) {
    if (instance.hasOwnProperty(prop)) {
        ... 
    }
}

如果instance只有一个属性,并且我想获取该属性名称,该怎么办?有没有比这样做更简单的方法:

var instance = { id: "foobar" };

var singleMember = (function() {
    for (var prop in instance) {
        if (instance.hasOwnProperty(prop)) {
            return prop;
        }
    }
})();

7 个答案:

答案 0 :(得分:44)

也许Object.keys可以为你效劳。如果其长度返回1,则可以使用yourObject[Objects.keys[0]]来获取对象的唯一属性。 MDN链接还显示自定义函数,以便在没有keys方法 1 的环境中使用。像这样的代码:

var obj = {foo:'bar'}, 
    kyz = Object.keys(obj);
if (kyz.length === 1){
   alert(obj[kyz[0]]); //=> 'bar'
} else {
  /* loop through obj */
}

1 某些旧版浏览器不支持Object.keys。 MDN链接提供代码以使其在这些浏览器中工作。请参阅上述MDN page

中的标题兼容性

答案 1 :(得分:13)

最短格式:

instance[Object.keys(instance)[0]];

ES6 +功能:

let first = v => v[Object.keys(v)[0]];

使用功能:

first({a:'first', b:'second'}) // return 'first'

答案 2 :(得分:2)

不幸的是,没有内置的“列表属性”功能,当然也没有“getFirstProperty”(特别是因为无法保证任何属性始终是“第一”)。

我认为你最好写一个像这样的函数:

/**
 * A means to get all of the keys of a JSON-style object.
 * @param obj The object to iterate
 * @param count maximum length of returned list (defaults to Infinity).
 */
function getProperties( obj, count )
{
    if( isNaN( count ) ) count = Infinity
    var keys = []
    for( var it in obj )
    {
        if( keys.length > count ) break;
        keys.push( it );
    }
    return keys;
}

然后,您可以访问该名称:

instance = {"foo":"bar"}
// String() on an array of < 2 length returns the first value as a string
// or "" if there are no values.
var prop = String(getProperties(instance, 1));

答案 3 :(得分:1)

虽然我的答案被低估了,但仍然值得知道javascript对象中的键顺序 no 。因此,理论上,任何基于迭代值的代码都可能不一致。一种方法可以是创建一个对象并定义实际提供计数,排序等的setter,并提供一些访问这些字段的方法。这可以在现代浏览器中完成。

所以,为了回答你的问题,一般来说你的方法仍然是大多数closs-browser。您可以使用lodash或任何其他现代框架进行迭代,这将隐藏“hasOwnProperty”的复杂性。截至2015年8月,Object.keys可以被视为跨浏览器和通用。毕竟IE8发生在几年前。在某些情况下,您只是不会将所有键集存储在数组中。但我会使用Object.keys - 与迭代相比,它更灵活。

答案 4 :(得分:0)

这是一篇旧帖子,但我最后根据Object.keys()编写了以下帮助函数。

返回第一个属性的keyvalue

getFirstPropertyKeyAndValue(sourceObject) {
    var result = null;
    var ownProperties = Object.keys(sourceObject);
    if (ownProperties.length > 0) {
      if (ownProperties.length > 1) {
        console.warn('Getting first property of an object containing more than 1 own property may result in unexpected results. Ordering is not ensured.', sourceObject);
      }
      var firstPropertyName = ownProperties[0];
      result = {key: firstPropertyName, value: sourceObject[firstPropertyName]};
    }
    return result;
  }

答案 5 :(得分:0)

  var foo = {bar: 1};
  console.log(Object.keys(foo).toString());

它将打印字符串

"bar"

答案 6 :(得分:0)

这里的答案都很好,但要注意顺序可能不可靠(尽管实际上似乎属性设置的顺序倾向于保持这种状态),这种快速而肮脏的方法也有效:

var obj = {foo: 1, bar: 2};
for(var key in obj) {
  //you could use key here if you like
  break;
}
//key now contains your first key

或更短的版本也应该这样做:

for(var key in obj) break;
//key now contains your first key