Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用索引访问对象属性会导致未定义的错误_Javascript_Jquery_Arrays_Object_Properties - Fatal编程技术网

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
函数将获胜