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

时间:2011-10-23 13:00:46

标签: javascript arrays

如果我有这样的数组:

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']);

情况并非如此,我特意寻找目标指数,就像第一个例子一样 - 如果可能的话。

10 个答案:

答案 0 :(得分:99)

  

“我特意想要定位索引,就像第一个例子一样 - 如果可能的话。”

不,这是不可能的。

最接近的是获取对象键的数组,然后使用:

var keys = Object.keys( obj );

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

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

答案 1 :(得分:41)

我能想到的唯一方法是创建一个方法,使用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

答案 2 :(得分:3)

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)

编辑:

  

“我特意想要定位索引,就像第一个例子一样 - 如果可能的话。”

实际上'指数'是关键。如果要存储键的位置,则需要创建自定义对象来处理此问题。

答案 3 :(得分:3)

如果您不想使用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

您可以详细了解此方法here

答案 4 :(得分:1)

我继续为您创建了一个功能

[Timestamp('2020-07-31 12:12:12.123456789')]
['2020-07-31T12:12:12.123456000'] 

答案 5 :(得分: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]])

答案 6 :(得分:0)

通过jquery你可以这样做:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);

答案 7 :(得分:0)

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

{{1}}

答案 8 :(得分:0)

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

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

this.myObject[this.propertiesName[0]]

答案 9 :(得分:0)

当然有可能,但它不像通过索引访问数组那么直接,但实际上仍然有可能,甚至相对简单:事实上,您不必太费劲。此代码示例将展示如何:

var obj = {
    'alfa'  : 'value of obj the key alfa',
    'beta'  : 'value of obj the key beta',
    'gamma'  : 'value of obj the key gamma'
};

var jbo = {
    'alfa'  : 'value of jbo the key alfa',
    'beta'  : 'value of jbo the key beta',
    'gamma'  : 'value of jbo the key gamma'
};

alert  ( obj[Object.keys(obj)[1]] );
alert ( jbo[Object.keys(jbo)[1]] );

/* you can even put it into a for loop as follows */

for (i=0;i<3;i++)
{
    document.writeln ( "<br>This could be even a piece of HTML: " + obj[Object.keys(obj)[i]] );
    document.writeln ( "<br>This could be even a piece of HTML: " + jbo[Object.keys(jbo)[i]] );
}

说明:

如您所知,Object.keys() 语句返回您在圆括号中键入的对象的所有可枚举属性(即所有键)的数组。 因此,您唯一需要做的就是在该数组之后指明索引 ,这将返回在该索引处找到的键字面量。 键本身像往常一样被返回该键值的对象“消化”。