Javascript 使用索引访问对象属性会导致未定义的错误
下面是一个包含一个对象的函数,我希望能够使用一个参数(即索引)访问对象中的特定主体 问题是,当我试图以这种方式访问属性时,我会 未定义 当控制台记录它时。我做错了什么Javascript 使用索引访问对象属性会导致未定义的错误,javascript,jquery,arrays,object,properties,Javascript,Jquery,Arrays,Object,Properties,下面是一个包含一个对象的函数,我希望能够使用一个参数(即索引)访问对象中的特定主体 问题是,当我试图以这种方式访问属性时,我会 未定义 当控制台记录它时。我做错了什么 moveLeftBtn.on('click', function(nr){ var theBody = { bodies: { a: 'foo1', b: 'foo2', c: 'foo3' } };
moveLeftBtn.on('click', function(nr){
var theBody = {
bodies: {
a: 'foo1',
b: 'foo2',
c: 'foo3'
}
};
var newBody = theBody.bodies[1]; // temporarily hardcoded value instead of argument
console.log(newBody); // <-- undefined, why?
return newBody;
});
moveLeftBtn.on('click',函数(nr){
var theBody={
机构:{
a:‘foo1’,
b:‘foo2’,
c:‘foo3’
}
};
var newBody=theBody.body[1];//临时硬编码值而不是参数
console.log(newBody);//我在代码中看到的唯一问题是您没有返回任何内容。更改
var newBody = theBody.bodies[nr];
…到
return theBody.bodies[nr];
…你应该很乐意去
编辑:哦,在定义了主体之后,您还缺少了;
主体。主体
不是一个数组,而是一个普通对象。通常,您无法访问带有数字索引的普通对象字段
但您可以通过定义body.body
对象来绕过它,如下所示:
var theBody = {
bodies: {
'0': 'foo1',
'1': 'foo2',
'2': 'foo3'
}
}
var newBodies = [], i = 0, j;
for (j in theBody.bodies) {
newBodies.push(theBody.bodies[j]);
}
以这种方式定义的body将有body.body[1]===='foo2'
如果由于任何原因无法更改正文
,则可以对其进行处理并创建另一个对象,您可以使用数字索引访问该对象中的字段-如下所示:
var theBody = {
bodies: {
'0': 'foo1',
'1': 'foo2',
'2': 'foo3'
}
}
var newBodies = [], i = 0, j;
for (j in theBody.bodies) {
newBodies.push(theBody.bodies[j]);
}
如果您body.body
在不总是普通对象(例如某些类型的实例)中与使用for
循环相比,它应该使用$进行迭代。每个或for
循环都应该使用hasOwnProperty
检查进行扩展。索引在Firefox上非常有效,但我不知道其他浏览器。您必须为索引检查添加更多逻辑。无论如何,您都不应该通过索引访问对象,因为属性的顺序可能会改变,您应该将它们视为映射或集合,而不是索引列表
在本例中,我在所有对象上附加了一个getByIndex()
函数。您可以创建自己的对象并将该函数附加到该对象上
下面是我制作的一个JSFIDLE,它可以满足您的需要:
Object.prototype.getByIndex=函数(属性,索引){
var n=0;
如果(这个hasOwnProperty(property)){
for(此[属性]中的var prop){
如果(n==索引){
log('找到匹配项:'+prop+':'+this[property][prop]);
归还此[财产][prop];
}否则{
n++;
}
}
}
返回未定义;
}
$('#moveLeft')。在('click',函数(nr)上{
var theBody={
机构:{
a:‘foo1’,
b:‘foo2’,
c:‘foo3’
}
};
var index=parseInt($('#input').val();
var currIndex=!isNaN(索引)?索引:0;
var newBody=theBody.getByIndex('body',currendex);
$('输出').val(新车身);
});
索引:
body.body
是一个具有三个属性的对象,分别名为a
、b
和c
。您没有给它任何名为1
。这就是body.body[1]
的值未定义的原因。如果您引用body.body['b']
您将找到所需的属性之一,其值为'foo1'
听起来你只需要阅读JavaScript数组和对象以及它们是如何工作的。不要基于你可能在其他语言中使用过的“关联数组”之类的东西进行任何假设。JavaScript是一种自己的语言,有自己的处理方式,所以你只需要学习它们。theBody.body[nr]
是正确的。这称为“括号表示法”。另请参见:。您编辑的代码工作正常:。请注意,括号表示法不是数组的特殊表示法,它是属性访问的一般工作方式。如果允许标识符以数字开头,则可以使用arr.1
而不是arr[1]访问数组
。使用obj.foo
或obj['foo']访问普通对象的方法相同
。规范中的相关部分:。如果希望项目为null
,请删除'null'周围的引号。
values@holyredbeard-好的,如果您看到(对象{a:Array[5],b:Array[5],c:Array[5]}),那么在主体
赋值之后缺少一个分号
,那么主体的属性是a
,b
,c
,而不是1
,2
,3
。当然主体。主体[1]
将显示未定义的。它应该是主体。主体['a']
。您想通过索引而不是名称访问属性吗?这是不可能的(至少不能直接访问)。谢谢!如果这样做,我会得到未定义的属性。非常奇怪!您要传递什么值?我已经在本地测试了它(在上面添加return语句之后),并像这样调用函数:AccessBody(1);
正在返回对象中的文本(在IE7和Firefox中测试)。在定义主体后也缺少一个冒号。
…更新了答案。“哦,在定义主体后也缺少;
”幸运的是分号是可选的;)问题不在于语法,而在于数据结构。我将我的问题更新为我正在尝试使用的确切函数(现在是硬编码值[1],而不是参数)。同样的问题。:/“通常不能使用数字索引访问普通对象的字段。”嗯,数组也一样(因为数组也只是对象)。您只能访问现有的属性。但属性名称可以是任意字符序列。对于数组,数字属性名称将以特殊方式处理。您的对象.prototype.getByIndex
函数将获胜