建立配对值数组

时间:2015-02-20 20:55:19

标签: javascript arrays

我一直在阅读几本关于Javascript的书籍,并在网上搜索了很多(最好的答案似乎是在stackoverflow上),我仍然不确定如何继续。

我所追求的是在Javascript / HTML应用程序中设置2-4个玩家,以便它知道玩家的真实姓名,分配别名(稍后是化身,但现在不是),起点,以及转动。

在John Duckett的一本书中, Javascript& JQuery ,我了解到我可以使用数组或对象。这些是相似的,但工作方式略有不同。

对于一个数组,我可能有这样的东西:

    var players= {
    Timmy = {alias: "Spike", turns:0}
     (and so on)
}

对于一个物体,我显然可以这样做:

 var players= {
        Timmy = {alias: "Spike", turns:0}
        /* and so on */
    }

我实际上并不确定哪个最好,但我倾向于阵列。我遇到困难的是,我很难弄清楚如何建立每个玩家,并使用值创建和填充数组,其中一些将从列表中随机选择(这部分我可以处理)

所以我尝试从一个基本的实验开始(它还没有工作),这个实验的交互性比我构建的其他东西要少,并且用配对填充数组元素。从名称和转弯的值开始小(全部从0开始),我有:



var p1="Billy";
var p2="Mikey";
var p3="Sammy";
var p4="";
var playerList=[];
createPList();
function pListConstructor(name, alias, turns) {
	this.name=name;
	this.alias=alias;
	this.turns=turns;
}

function aliasChooser() {
	return alias
}
function createPList() {
	if(p1!=="") {
		playerList.push({pName: p1});
	}
	if(p2!=="") {
		playerList.push({pName: p2});
	}
	if(p3!=="") {
		playerList.push({pName: p3});
	}
	if(p4!=="") {
		playerList.push({pName: p4});;
	}
	document.getElementById("player1Disp").innerHTML=playerList[0].name;
	document.getElementById("player2Disp").innerHTML=playerList[1].name;
	document.getElementById("player3Disp").innerHTML=playerList[2].name;
	document.getElementById("player4Disp").innerHTML=playerList[3].name;
}




我基于JS最近学习的想法以及几年前在Actionscript中的一些体面的经验是我应该能够使用push()方法添加到具有配对值的数组,但到目前为止我还是#&我没有成功。

任何提示或推动都很棒! Ť

编辑: 我在学习如何填充数组方面取得了一些进展,但关键问题是给我一些麻烦:



var p1 = "sammny";
var p2 = "mikey";
var p3 = "Pete";
var p4 = "Rick";

var playerList = [];
var sCash = 0;
var pTurn = 0;
var currentPlayer;

var alias1 = "dickey";

/* store names by male and female for selection later */
/*SOLVED: Bad grammar never works in code! 
I used () instead of []  */
/* var aliasM = ("Spike", "Mike", "Pops", "Noodles", "Shorty");
var aliasF = ("Shanna", "Rose", "Sugar", "Alana"); */
//the right way:
var aliasM = ["Spike", "Mike", "Pops", "Noodles", "Shorty"];
var aliasF = ["Shanna", "Rose", "Sugar", "Alana"];

function aliasSelector() {
    if (Math.random() <= 0.55) {
        alias1 = aliasM[Math.floor(Math.random() * aliasM.length)];
    } else {
        alias1 = aliasF[Math.floor(Math.random() * aliasF.length)];
    }
    return alias1;
}
/*I realized I was missing the return here.
I fixed that, but now it is feeding back only the first letter of the elements? */

function playerGen(name, alias, turns) {
    this.name = name;
    this.alias = aliasSelector();
    this.turns = 0;
}

nameCheck();

function nameCheck() {
    if (p1 !== "") {
        playerList.push(new playerGen(p1));
    }
    if (p2 !== "") {
        playerList.push(new playerGen(p2));
    }
    if (p3 !== "") {
        playerList.push(new playerGen(p3));
    }
    if (p4 !== "") {
        playerList.push(new playerGen(p4));
    }

    document.getElementById("player1Disp").innerHTML = playerList[0].name;
    document.getElementById("player2Disp").innerHTML = playerList[1].alias;
    document.getElementById("player3Disp").innerHTML = playerList[2].turns;
    document.getElementById("player4Disp").innerHTML = playerList[3].name;
}
&#13;
<body>
    <p id="player1Disp"></p>
    <p id="player2Disp"></p>
    <p id="player3Disp"></p>
    <p id="player4Disp"></p>
</body>
&#13;
&#13;
&#13;

解决并完成。我的编程经验大部分都在使用Actionscript,这是我明显坚持使用array =()而不是[]的地方。这一点点的学习和任何帮助我在我的开发和我正在努力的这个小项目中的转折点。谢谢!

1 个答案:

答案 0 :(得分:0)

基本上你的两个例子是相同的,既不定义对象也不定义数组:)。

如果我是你,我会怎么做(但我不是,所以我可能会出错):

首先,忘记JavaScript,看看你在功能上需要什么。

我想你想拥有一个带有一些属性和方法的玩家对象 然后我想你想要一个数组的玩家(如果你想要的话,还是一个列表,但无论如何不是对象,而且代表每个玩家的属性不同)。

现在的问题是,如何在JS中做到这一点。

基本上JS语法非常通用。例如,您可以使用“对象”表示法将对象 p 命名为 o o.p )或“关联数组”表示法( o["p"] )。

重要的一点是,一个对象不仅会被它的内容定义,还会被它的类定义,这个类恰好由用来创建它的函数定义。

例如,如果我定义它:

function Player (name, alias, turns) {
    this.name=name;
    this.alias=alias;
    this.turns=turns;
}

我创建了一个具有3个属性的对象Player。 要创建此对象的实例,我将使用operator new,如下所示:

var Bob = new Player ("bob", "killer", 123);

有人可能会认为你可以这么说:

var Jim = { 'name':'jim', 'alias':'greenhorn', 'turns':123 };

如果您只是访问属性,这实际上可能是等效的。但是,大多数对象也都有方法。

让我们向玩家添加一个方法“sayHi”:

Player.prototype.sayHi = function() { console.log ("Hi, my name is "+this.name); }

现在我们可以和Bob一起使用:

Bob.sayHi(); // Hi, my name is bob

如果你和吉姆一起试试:

Jim.sayHi() // JS error : sayHi : no such property

这里发生的是Bob实际上是类Player,所以在查找sayHi属性时,解释器会扫描prototype数组,因为你如果您愿意,定义protopype.sayHi(或prototype["sayHi"]),它将使用它。

Jim是一个基本对象,所以解释器自然无法找到与sayHi方法的关系。

现在,如果您使用var players = [];中的括号表示法,则可以创建Array对象的实例,该对象具有许多预定义方法(push()等等)。

因此,要创建一个列表/数组的玩家,您可以使用以下内容:

function Player (name, alias) {
    this.name=name;
    this.alias=alias;
    this.turns=123; // probably no need to pass this value as a parameter
}
Player.prototype.get_alias = function() { return this.alias; }

var players = [];
players.push (new Player ("bob", "killer"));
players.push (new Player ("jim", "greenhorn"));

console.log(players[1].get_alias()); // greenhorn

get_alias方法实际上并不是很有用,因为你不能在JS中拥有私有成员(或者至少不能在C ++中使用相同的接受),所以你也可以使用players[1].alias直接,但我试图坚持你原来的例子。