给对象属性一个数组值

Giving an object property an array value?

本文关键字:一个 数组 对象 属性      更新时间:2023-09-26

我有以下代码,我想让牌组阵列充满52张不同的牌。每当我运行代码并提醒卡对象时,它就会显示为"[对象对象]"。

有人能向我解释一下为什么会这样做,以及这个问题的解决方案吗?

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"];
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"];
var deck = []; 
for (var i = 0; i < suits.length; i++) {
    for (var j = 0; j < ranks.length; j++) {
        var card = {rank: ranks[j], suit: suits[i]};
        deck.push(card);
        alert(card)
    }
}

为什么这样做

这完全正常。当您执行alert()时,您创建的卡对象不知道如何表示自己,原因很简单,因为没有toString()方法实现。

问题解决方案

尝试为每个卡对象指定一个匿名toString()函数实现,如下所示:

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"];
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"];
var deck = []; 
for (var i = 0; i < suits.length; i++) {
    for (var j = 0; j < ranks.length; j++) {
        var card = {
                       rank: ranks[j], 
                       suit: suits[i],
                       toString : function() { return this.rank + ' ' + this.suit; }
                   };
        deck.push(card);
        //alert(card); // console.log doesn't block code execution
        console.log(card.toString());
    }
}

注意

您应该考虑使用console.log()而不是alert(),因为它不那么烦人,而且更容易在控制台中调试(点击F12)。但是要小心运行IE9或更低版本的生产代码,因为当开发者控制台没有打开时,他们的javascript引擎会崩溃。

发生这种情况是因为您指定了要提醒的整个对象,而提醒不知道哪些属性是相关的。如果你想要一个对象的可扩展视图,你可以使用console.log(card),这将把你的对象作为树视图输出到浏览器开发者控制台。

对象就是这样显示的,它的toString方法就是这样输出的,要查看它的内容,请使用

alert(JSON.stringify(card));

您应该将警报更改为:

alert(JSON.stringify(card))

FIDDLE演示

用此-->警报(JSON.stringfy(卡))替换您的警报

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"];
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"];
var deck = []; 
for (var i = 0; i < suits.length; i++) {
    for (var j = 0; j < ranks.length; j++) {
        var card = {rank: ranks[j], suit: suits[i]};
        deck.push(card);
       alert(JSON.stringify(card))//CHANGE THIS...
       console.log(JSON.stringify(card))
    }
}

解释

stringify将JavaScript数据结构转换为JSON文本。Json文本只不过是文本的键:值对。它再简单不过了。