如果我想枚举对象的属性并想要忽略原型,我会使用:
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;
}
}
})();
答案 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()编写了以下帮助函数。
返回第一个属性的key
和value
。
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