获取对象的第一个索引

Posted

技术标签:

【中文标题】获取对象的第一个索引【英文标题】:Getting the first index of an object 【发布时间】:2010-10-28 21:12:03 【问题描述】:

考虑:

var object = 
  foo: ,
  bar: ,
  baz: 

我该怎么做:

var first = object[0];
console.log(first);

显然,这不起作用,因为第一个索引名为foo, 不是0

console.log(object['foo']);

有效,但我不知道它的名字是 foo。它可以被命名为任何东西。我只想要第一个。

【问题讨论】:

【参考方案1】:

没有办法获取第一个元素,因为 javascript 中的“哈希”(对象)具有无序的属性。最好的办法是将键存储在一个数组中:

var keys = ["foo", "bar", "baz"];

然后用它来获得正确的值:

object[keys[0]]

【讨论】:

【参考方案2】:

我昨天也遇到了同样的问题。我是这样解决的:

var obj = 
        foo:,
        bar:,
        baz:
    ,
   first = null,
   key = null;
for (var key in obj) 
    first = obj[key];
    if(typeof(first) !== 'function') 
        break;
    

// first is the first enumerated property, and key it's corresponding key.

不是最优雅的解决方案,我很确定它可能会在不同的浏览器中产生不同的结果(即规范说枚举不需要以与定义相同的顺序枚举属性)。但是,我的对象中只有一个属性,所以这不是问题。我只需要第一把钥匙。

【讨论】:

嗨@PatrikAkerstrand 早我不小心点击了downvote。请在您的 anwser 中进行任何更改,以便我撤消它。对不起。【参考方案3】:

你可以这样做:

var object = 
    foo:a:'first',
    bar:,
    baz:



function getAttributeByIndex(obj, index)
  var i = 0;
  for (var attr in obj)
    if (index === i)
      return obj[attr];
    
    i++;
  
  return null;



var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( a:'first' )

【讨论】:

【参考方案4】:

如果对象的顺序很重要,您应该修改 JSON 模式以将对象存储在数组中:

[
    "name":"foo", ...,
    "name":"bar", ...,
    "name":"baz", ...
]

或者也许:

[
    ["foo", ],
    ["bar", ],
    ["baz", ]
]

正如 Ben Alpert 所指出的,Javascript 对象的属性是无序的,如果您希望它们按照对象字面量中指定的相同顺序进行枚举,那么您的代码就会被破坏——没有“第一个”属性。

【讨论】:

我从未见过 for(i in obj) 以不同的顺序做事,你是说有时 for(i in obj) 会以不同的顺序踢出事情吗? 它有可能会。规范说它不必按特定顺序枚举。这几乎意味着该顺序可能会改变。 如今大多数浏览器都保留了插入顺序,但并非总是如此;它不是规范要求的,并且有最新版本的 Chrome 没有保留插入顺序。 随着我对我正在做的事情的深入了解,事情的顺序变得更加重要(我以为我只关心第一个,但我错了!)所以很清楚将我的对象存储在一个按照您的建议进行数组。 如果你知道对象只有一个元素,那么你就知道顺序。【参考方案5】:

他们不是真正订购的,但你可以这样做:

var first;
for (var i in obj) 
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') 
        first = obj[i];
        break;
    

.hasOwnProperty() 对忽略原型对象很重要。

【讨论】:

上述代码有错误。 typeof 检查应该是 typeof(i) @Napalm 他指的是正在检查的变量名称中的错误,而不是语法。你是对的,但很多人喜欢括号的可读性 谢谢。太棒了。【参考方案6】:

如果你想要一些简洁的尝试:

for (first in obj) break;

alert(first);

包装成一个函数:

function first(obj) 
    for (var a in obj) return a;

【讨论】:

请参阅下面 Luke Schafer 的回答,它使用 hasOwnProperty 方法来确保您不会抓取原型成员。 要在包括 IE8 及更低版本在内的所有浏览器中工作的单行代码,请使用 for (var key in obj) if (obj.hasOwnProperty(key)) break; 然后您需要使用 key 变量 如果第一个元素是对象类型,不起作用。返回 0 Object.keys(obj)[0];for (1.644ms) 快得多 (0.072ms)。【参考方案7】:

我的解决方案:

Object.prototype.__index = function(index)

    var i = -1;
    for (var key in this)
    
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    
    return null;

aObj = 'jack':3, 'peter':4, '5':'col', 'kk':function()alert('hell');, 'till':'ding';
alert(aObj.__index(4));

【讨论】:

不错,只是……你的编码风格!搞什么鬼?那些大括号无处不在! 你知道python风格吗?我刚刚在 python 样式中添加了垂直对齐的大括号。无论如何,“地狱是其他人”,:-D【参考方案8】:

基于CMSanswer。我不直接获取值,而是在其索引处获取键并使用它来获取值:

Object.keyAt = function(obj, index) 
    var i = 0;
    for (var key in obj) 
        if ((index || 0) === i++) return key;
    
;


var obj = 
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
;

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'

【讨论】:

【参考方案9】:

只是为了好玩,这在 JS 1.8.5 中有效

var obj = a: 1, b: 2, c: 3;
Object.keys(obj)[0]; // "a"

这与您看到的相同顺序匹配

for (o in obj)  ... 

【讨论】:

清除最好的选择,除非需要石器时代的后记兼容性。 100% 最佳答案。这是最简单、最快捷的方法。 澄清一下,根据en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 在 IE9 之前不受支持。不幸的是,许多人仍处于石器时代。 伟大的。简短而简单。谢谢@Jacob 如果有人在使用 IE9 ? 我能感觉到他的痛苦。谢谢,这太棒了【参考方案10】:

使用下划线可以使用 _.pairs 获取第一个对象条目作为键值对,如下所示:

_.pairs(obj)[0]

然后,该键将具有另一个 [0] 下标,即带有 [1] 的值

【讨论】:

使用 underscore.js 时效果最佳。正是我需要的...谢谢你,乔治!【参考方案11】:

这不会给你第一个,因为 javascript 对象是无序的,但在某些情况下这很好。

myObject[Object.keys(myObject)[0]]

【讨论】:

【参考方案12】:

你可以使用对象的第一个键

console.log(Object.keys(object)[0]);//print key's name

为了价值

console.log(object[Object.keys(object)[0]]);//print key's value

【讨论】:

【参考方案13】:

获取对象的第一个键

const myObject = 
   'foo1':  name: 'myNam1' ,
   'foo2':  name: 'myNam2' 


const result = Object.keys(myObject)[0];

// result will return 'foo1'

【讨论】:

这个答案和雅各布的有什么区别? 它让新人相信这种代码可以完美运行。【参考方案14】:

ES6

const [first] = Object.keys(obj)

【讨论】:

它可以工作,但你能解释一下它是如何工作的吗?仅显示代码无法让我理解。 这是一个destructuring assignment。本质上,它将返回数组的第一个元素分配给方括号内的变量。

以上是关于获取对象的第一个索引的主要内容,如果未能解决你的问题,请参考以下文章

将指针分配给字符串对象的第一个和最后一个索引

在不知道索引的情况下获取系列的第一个元素[重复]

获取从VBA中的段落获得的行的第一个单词的索引号

获取包含元组的列表的索引,其中元组的第一个元素与模式匹配

R语言使用Which.max和Which.min函数定位数据对象中的第一个最大值或最小值实战:使用which.max函数查找第一个最大值的索引使用which.min函数查找第一个最小值的索引

PHP删除数组的第一个索引并重新索引