如何访问JavaScript对象的第一个属性?

有没有一种优雅的方法来访问对象的第一个属性…

  1. 你不知道你房产的名字
  2. 不使用for .. in或jQuery的$.each之类的循环

例如,我需要在不知道fo1名称的情况下访问foo1对象:

var example = {foo1: { /* stuff1 */},foo2: { /* stuff2 */},foo3: { /* stuff3 */}};
722912 次浏览

尝试#0循环并在第一次迭代后中断:

for (var prop in object) {// object[prop]break;}

否。由MDN定义的对象文字是:

对象的零对或多对属性名称和关联值的列表,用花括号({})括起来。

因此,对象文字不是数组,您只能使用其显式名称或使用in关键字的for循环访问属性。

没有“第一”属性。对象键是无序的。

如果您使用for(var foo in bar)循环它们,您将以一些的顺序获得它们,但将来可能会更改(特别是如果您添加或删除其他键)。

如果你需要访问“对象的第一个属性”,这可能意味着你的逻辑有问题。对象属性的顺序应该无关紧要。

这一点以前在这里已经讨论过了。

first的概念不适用于对象属性,规范也不能保证for… in循环的顺序,但在实践中,它对chrome(bug报告)来说是可靠的FIFO除了。做出相应的决定。

正如其他人所指出的,如果属性的顺序很重要,那么将它们存储在对象中不是一个好主意。相反,您应该通过方括号使用数组。例如,

var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];var first = example[0];

请注意,您丢失了'foo'标识符。但您可以向包含的对象添加name属性:

var example = [{name: 'foo1', /* stuff1 */},{name: 'foo2', /* stuff2 */},{name: 'foo3', /* stuff3 */}];var whatWasFirst = example[0].name;

对于那些寻求类似问题答案的人,即:“我如何找到与特定模式匹配的一个或多个属性?”,我建议使用Object.keys()

for (const propName of Object.keys(example)) {if (propName.startsWith('foo')) {console.log(`Found propName ${propName} with value ${example[propName]}`);break;}}

使用Object.keys获取对象属性的数组。示例:

var example = {foo1: { /* stuff1 */},foo2: { /* stuff2 */},foo3: { /* stuff3 */}};
var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)

文档和跨浏览器垫片提供这里。它的使用示例可以在我的另一个答案这里中找到。

编辑:为了清楚起见,我只想回应其他答案中正确陈述的内容:JavaScript对象中的键顺序未定义。

var obj = { first: 'someVal' };obj[Object.keys(obj)[0]]; //returns 'someVal'
Object.values(obj)[0]; // returns 'someVal'

使用它,您还可以通过索引访问其他属性。请注意!Object.keysObject.values返回顺序不保证根据ECMAScript,但非正式地由所有主要浏览器实现,请阅读https://stackoverflow.com/a/23202095了解有关此的详细信息。

我不建议你使用Object.keys,因为旧版本的IE不支持它。但如果你真的需要,你可以使用上面的代码来保证向后兼容:

if (!Object.keys) {Object.keys = (function () {var hasOwnProperty = Object.prototype.hasOwnProperty,hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),dontEnums = ['toString','toLocaleString','valueOf','hasOwnProperty','isPrototypeOf','propertyIsEnumerable','constructor'],dontEnumsLength = dontEnums.length;
return function (obj) {if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {if (hasOwnProperty.call(obj, prop)) result.push(prop);}
if (hasDontEnumBug) {for (var i=0; i < dontEnumsLength; i++) {if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);}}return result;}})()};

功能Firefox(Gecko)4(2.0)Chrome5 Internet Explorer 9 Opera 12Safari5

更多信息:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

但如果你只需要第一个,我们可以安排一个更短的解决方案,如:

var data = {"key1":"123","key2":"456"};var first = {};for(key in data){if(data.hasOwnProperty(key)){first.key = key;first.content =  data[key];break;}}console.log(first); // {key:"key",content:"123"}

一个单行版本:

var val = example[function() { for (var k in example) return k }()];

你也可以做Object.values(example)[0]

豆沙库的解决方案:

_.find(example) // => {name: "foo1"}

但是没有保证对象属性内部存储顺序,因为它依赖于javascript VM实现。

有什么理由不这样做吗?

> example.map(x => x.name);
(3) ["foo1", "foo2", "foo3"]

要获取对象中的第一个键名,您可以使用:

var obj = { first: 'someVal' };Object.keys(obj)[0]; //returns 'first'

返回一个字符串,因此如果有嵌套对象,则无法访问,例如:

var obj = { first: { someVal : { id : 1} };使用该解决方案,您无法访问id。

如果您想获得实际对象,最好的解决方案是使用Lodash,例如:

obj[_.first(_.keys(obj))].id

返回第一个键的值(如果您不知道第一个键的确切名称):

var obj = { first: 'someVal' };obj[Object.keys(obj)[0]]; //returns 'someVal'

如果您知道密钥名称,请使用:

obj.first

obj['first']

最上面的答案可以生成整个数组,然后从列表中捕获。这是另一个有效的快捷方式

var obj = { first: 'someVal' };Object.entries(obj)[0][1] // someVal

我们也可以用这个方法。

var example = {foo1: { /* stuff1 */},foo2: { /* stuff2 */},foo3: { /* stuff3 */}};Object.entries(example)[0][1];

以下是获取第一个密钥的更简洁的方法:

var object = {foo1: 'value of the first property "foo1"',foo2: { /* stuff2 */},foo3: { /* stuff3 */}};
let [firstKey] = Object.keys(object)
console.log(firstKey)console.log(object[firstKey])

如果有人喜欢阵列解构

const [firstKey] = Object.keys(object);

您可以使用Object.values()访问对象的值:

var obj = { first: 'someVal' };Object.values(obj)[0]; // someVal

优雅地遍历键值的基本语法

const object1 = {a: 'somestring',b: 42};
for (const [key, value] of Object.entries(object1)) {console.log(`${key}: ${value}`);}
// expected output:// "a: somestring"// "b: 42"

一个更有效的方法来做到这一点,而不调用Object.keys()Object.values()返回一个数组:

Object.prototype.firstKey = function () {for (const k in this) {if (Object.prototype.hasOwnProperty.call(this, k)) return k;}return null;};

然后你可以像这样使用它:

const obj = {a: 1, b: 2, c: 3}console.log(obj.firstKey()) //=> 'a'

这不一定返回第一个键,请参阅“for(… in…)”循环中的元素顺序

这是一个老问题,但大多数解决方案都假设我们知道属性的名称,但事实并非如此,例如,如果您试图从用户可以上传的文件中可视化数据或类似情况。

这是一个简单的函数,我在你知道变量的两种情况下都使用和工作,如果不是,它将返回对象的第一个属性(按字母顺序排序)

label函数接收一个对象d,如果退出则提取key,否则返回对象的第一个属性。

const data = [{ label: "A", value: 10 },{ label: "B", value: 15 },{ label: "C", value: 20 },{ label: "D", value: 25 },{ label: "E", value: 30 }]
const keys = ['label', 0, '', null, undefined]
const label = (d, k) => k ? d[k] : Object.values(d)[0]
data.forEach(d => {console.log(`first: ${label(d)}, label: ${label(d, keys[0])}`)})
keys.forEach(k => {console.log(`label of ${k}: ${label(data[0], k)}`)})

对于0''nullundefined等值,将返回数组的第一个元素。

这就是我的解决方案

  const dataToSend = {email:'king@gmail.com',password:'12345'};const formData = new FormData();for (let i = 0; i < Object.keys(dataToSend).length; i++) {formData.append(Object.keys(dataToSend)[i],Object.values(dataToSend)[i]);}
console.log(formData);