通过索引访问非数字对象属性?


88

如果我有一个像这样的数组:

var arr = ['one','two','three'];

我可以通过执行以下操作访问不同的部分:

console.log(arr[1]);

如何按对象顺序而不是键访问对象属性?

例:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

我将如何获得每个对象的第一个属性-来自“事物”obj和来自“事物”jbo不显式使用属性名称的情况下,?

现在,你们中的一些人似乎认为我在追求类似的东西:

console.log(obj['something']);

情况并非如此,我想像第一个示例一样专门针对索引-如果可能的话。


2
您所说的“对象数组”是什么意思。数组一个对象。您是指不是数组的对象,还是指对象的数组。jQuery如何影响您的问题?您唯一的代码示例说明了您已经知道如何做的部分。如何提供一些说明问题的代码。
user113716 2011年

@Ӫ_._Ӫ我标记jQuery的原因是为了获得更广泛的受众,我认为知道jQuery的任何人都必须对数组有一定的了解,而不是与我的问题相矛盾,这是教科书中的东西。
daryl 2011年

4
实际上,我想说的是“知道” jQuery而又不懂JavaScript的人比反之亦然(至少知道JavaScript的人应该能够轻松理解jQuery)....关于您的实际问题:不,您无法通过索引访问objec属性。他们没有命令。
菲利克斯·克林

2
“ ...我想知道jQuery的任何人都必须对数组的了解...”我不会打赌。
user113716 2011年

1
@Brogrammer:这个问题与jQuery无关,因此jQuery标签不合适。
2011年

Answers:


125

“如果可能的话,我正像第一个示例一样专门针对索引。”

不,不可能。

您可以获得的最接近的结果是获取对象键的数组,并使用该数组:

var keys = Object.keys( obj );

...但是不能保证键将按照您定义的顺序返回。所以最终可能看起来像:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()如果您知道对象的内容,则可以可靠地使用它。这里的更多细节:stackoverflow.com/questions/280713/...
cronoklee

3
Object.keys()方法返回给定对象自己的可枚举属性的数组,其顺序与for ... in循环所提供的顺序相同(区别在于for-in循环枚举原型链中的属性为:好)。developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
阿姆鲁Ragaey

6
一切
皆有

48

我能想到的唯一方法是创建一个使用赋予您属性的方法Object.keys();

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

演示:http//jsfiddle.net/UmkVn/

可以使用将此方法扩展到所有对象,Object.prototype;但通常不建议这样做。

而是使用函数助手:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

1
这很酷,就像一个魅力!为什么不接受答案?您可能应该使用return this[Object.keys(this)[n]];使其通用。
cronoklee 2012年

3
您好,2016年起,我们未来的人们仍然认为这应该是公认的答案。伟大的解决方案
mhodges

它不是可接受的答案的原因是因为直到es6,Object.keys的顺序都无法保证。因此,即使该代码可在少数JS引擎中工作,也不能保证在所有JS引擎中都能工作。stackoverflow.com/questions/5525795/…–
ptoinson

13

Object.values()如果您不想使用,可以使用该方法Object.keys()

Object.keys()返回给定对象自己的可枚举属性的数组的方法相反,例如:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

将打印以下数组:

[ 'a', 'b', 'c' ]

Object.values()方法返回给定对象自己的可枚举属性的数组values

因此,如果您具有相同的对象,但改用值,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

您将获得以下数组:

[ 'somestring', 42, false ]

因此,如果您想访问object1.b,而使用索引,则可以使用:

Object.values(object1)[1] === 42

您可以在此处阅读有关此方法的更多信息。


1
在本主题中建议的这种方法似乎是最短和最优雅的。
Petro Franko

5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

编辑:

“如果可能的话,我正像第一个示例一样专门针对索引。”

实际上,“索引”是关键。如果要存储键的位置,则需要创建一个自定义对象来处理它。


我确实知道您可以通过密钥访问它,这不是我要的。
daryl

@Brogrammer:您的问题模棱两可,因此本帖子确实有可能按照书面回答该问题。
2011年


2

获取键数组,将其反转,然后运行循环

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }

1

您可以创建一个填充有您的对象字段的数组,并使用该数组上的索引并通过该对象访问对象属性

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]

1

我继续为您提供了一个功能:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"


1
您能否解释一下您的方法正在做什么?
Rahul Bhobe

我在代码中添加了一些注释,因此您可以了解正在执行的操作。
StackGeek

0

如果不确定Object.keys()是否会以正确的顺序返回键,则可以尝试使用以下逻辑

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.