【问题标题】:alert() entire multi-dimensional objectalert() 整个多维对象
【发布时间】:2012-09-18 19:04:18
【问题描述】:

我的整个代码示例如下和 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

【问题讨论】:

  • 在浏览器的开发工具或 firebug 中使用 console.logconsole.dir
  • @canon 谢谢!我以为我在使用一个对象。如何将我的代码更改为对象而不是数组?

标签: javascript arrays object alert stringify


【解决方案1】:

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

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

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

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

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

并在您提供的代码中一对一更改 (fiddle):

//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​

【讨论】:

  • 感谢您最初的 cmets、回答和小提琴。我没有意识到[]{} 之间的区别。
  • 我认为您的答案与 xdazz 的答案合并会非常好。您的回答很全面,但 xdazz 的回答只是显示了如何根据我提供的代码解决问题。
  • 对您的原始版本进行了轻微修改......不过,我的第一个代码示例更优雅。
【解决方案2】:
var movieID = 55555;
votes[movieID]

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

如果你这样做

console.log(votes.length);

你会看到这个结果:

 77778 

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

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

【讨论】:

  • 谢谢!在我急于建立一个例子时,我不小心把var votes = []; 放了两次。接得好!你剩下的答案是正确的并解决了这个问题,现在我只需要选择最明确的答案。再次感谢!
【解决方案3】:

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

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

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

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

【讨论】:

  • 谢谢!这绝对是问题所在。
【解决方案4】:

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

改变

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

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

等等。

【讨论】:

  • 虽然每个人都谈到了问题所在,但根据我提供的代码,我觉得您的回答是最清晰、最简洁的。谢谢!
【解决方案5】:

alert 不是调试工具

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

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

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

【讨论】:

  • 谢谢!我在 Chrome 的开发者工具中使用了console.log(votes),效果很好。再次感谢!
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多