2

我的整个代码示例在下面和 jsFiddle 上:http: //jsfiddle.net/rEhvt/

我正在尝试alert()我的多维 JavaScript 对象。如果我alert()对象的单个属性 - 它的工作原理。例如:

alert(votes['77777'].stay);

但是,如果我尝试alert()整个对象,那么我会得到很多NULLs 或空白。我尝试了以下方法:

alert(JSON.stringify(votes));//returns lots of NULLs

alert(votes.join('\n'));//returns lots of blanks

我的意图是最终将对象发送到 localStorage

localStorage['votes']=JSON.stringify(votes);

并用

retrievedVotes=JSON.parse(localStorage['votes'])

但是,我希望首先能够看到对象结构。这是我第一次尝试使用 JavaScript 理解多维对象,因此非常感谢您提供的任何帮助!下面是我的所有代码,它也在 jsFiddle 上:http: //jsfiddle.net/rEhvt/

//Movie #1
var movieID = 55555;
var stay = 'yes';

var votes = [];
votes[movieID]=[];
votes[movieID].stay = stay;

var scenes = 1;
votes[movieID].scenes = scenes; 

//Movie #2
var movieID = 77777;
var stay = 'no';

var votes = [];
votes[movieID]=[];
votes[movieID].stay = stay;

var scenes = 0;
votes[movieID].scenes = scenes; 

//Alert Single Item from votes
alert(votes['77777'].stay);

//Alert entire object
alert(JSON.stringify(votes));//returns NULLs

//Alert entire object
alert(votes.join('\n'));//returns lots of blanks
4

5 回答 5

1
var movieID = 55555;
votes[movieID]

这为该电影设置了第 55555 票指数!这就是为什么你有大量的空白。77777 也是如此。

如果你这样做

console.log(votes.length);

你会看到这个结果:

 77778 

另一个问题,当你制作第二部电影时,你完全擦除了数组var votes = [];

您想创建对象而不是数组。那是使用花括号{ }而不是[ ]

于 2012-09-27T04:00:14.887 回答
1

您可以在定义变量时使用{}而不是。[]votes

当您定义数组并通过索引设置值时,如果它之前没有元素,它会用空值填充它。例如代码:

var arr = [];
arr[5]​ = 0;
alert(JSON.stringify(arr));​​​

将提供[null,null,null,null,null,0].

于 2012-09-27T04:00:56.700 回答
1

使用对象{}而不是数组[]...设置votes[7777]将重新索引数组以容纳 7,778 个元素...具有大量未定义的元素(JSON.stringify()将转换为null)。

另外,您正在数组上设置命名属性:

votes[movieID]=[];
votes[movieID].stay = stay;

这是一个使用对象(小提琴)的功能示例:

var votes = {
    // Movie #1
    '55555': { 
        stay: 'yes',
        scenes: 1,
        outtakes: 0,
        enhanced: 0,
        teaser: 0
    },
    // Movie #2
    '77777': { 
        stay: 'no',
        scenes: 0,
        outtakes: 0,
        enhanced: 0,
        teaser: 0
    }   
};

console.log(votes[77777].stay);
console.log(votes);

并在您提供的代码(小提琴)中进行一对一的更改:

//Movie #1
var movieID = 55555;
var stay = 'yes';

var votes = {}; // changed to {}
votes[movieID]= {}; // changed to {}
votes[movieID].stay = stay;

var scenes = 1;
votes[movieID].scenes = scenes; 
var outtakes = 0;
votes[movieID].outtakes = outtakes; 
var enhanced = 0;
votes[movieID].enhanced = enhanced; 
var teaser = 0;
votes[movieID].teaser = teaser; 

//Movie #2
var movieID = 77777;
var stay = 'no';

//var votes = []; removed
votes[movieID]= {};  // changed to {}
votes[movieID].stay = stay;

var scenes = 0;
votes[movieID].scenes = scenes; 
var outtakes = 0;
votes[movieID].outtakes = outtakes; 
var enhanced = 0;
votes[movieID].enhanced = enhanced; 
var teaser = 0;
votes[movieID].teaser = teaser; 

//Alert Single Item from votes
alert(votes['77777'].stay);

//Alert entire object/array
alert(JSON.stringify(votes));//returns NULLs​
于 2012-09-27T04:01:42.873 回答
1

您正在使用array,但您需要的是对象。

改变

var votes = [];
votes[movieID]=[];

var votes = {};
votes[movieID]={};

等等。

于 2012-09-27T04:03:24.353 回答
1

alert不是调试工具

您说您希望“首先能够看到对象结构”,因此您应该使用适当的开发人员工具。您的浏览器可能有这些,请按F12。如果您使用 Firefox,请安装 Firebug。

然后你可以使用类似的命令console.log(votes),整个东西都会输出到开发者控制台,你可以像树一样用鼠标导航它。

如果你真的想递归.toString()每个对象然后alert它,这是可能的,但我看不出有什么好的理由这样做。

于 2012-09-27T04:05:37.680 回答