JavaScript indexOf()为数组中的已识别对象返回-1

时间:2016-06-30 03:01:32

标签: javascript object indexof

在为HTML 5游戏(使用画布)创建骨架时,我注意到一个关于JavaScript语言的有趣怪癖,我似乎并不太明白!

具体来说,我创建了一个对象(节点)数组,我可以毫无问题地通过函数(" node"),但即使确认在控制台日志中识别出所述对象,{ {1}}方法似乎无法将所述对象识别为数组中的项(给我通用" -1"输出)。



.indexOf()

function StartGame(){
	//Initiating draw variables
	cx = document.getElementById("GameMap")
	seeds = cx.getContext("2d")
	//Resetting nodes
	nodes = []
	GenNodes() //randomly generates and scatters new connector nodes on the game-map
}

function GenNodes() {
		for (i=0; i<10; i++) {
		nodes[i]= new SeedNode()
		}
}

function SeedNode() {
		this.shape = "circle"
		this.radius = "10"
		this.x = 730*Math.random() + 10
		this.y = 730*Math.random() + 10
		DrawNode(this,this.x,this.y)
} 

function DrawNode(node,x_cen,y_cen) {
	console.log(node)
	console.log(nodes.indexOf(node))
	seeds.beginPath();
	seeds.arc(x_cen,y_cen,10,0,2*Math.PI);
	seeds.stroke();
	seeds.fillText(nodes.indexOf(node),x_cen,y_cen)
}
&#13;
&#13;
&#13;

我的(相当简单的)猜测是对象在某种程度上不是这种基于数组的方法的有效输入。如果是这种情况,是否有符合W3C标准的方法来解决这个问题?

3 个答案:

答案 0 :(得分:3)

您尝试在将节点添加到nodes之前打印索引。你将永远得到-1。简而言之,请将DrawNode移出SeedNode

function GenNodes() {
    for (var i=0; i<10; i++) {
        var node = new SeedNode()
        nodes.push(node)
        DrawNode(node,node.x,node.y)
    }
}

function SeedNode() {
    var node = {}
    node.shape = "circle"
    node.radius = "10"
    node.x = 730*Math.random() + 10
    node.y = 730*Math.random() + 10 
    return node 
} 

答案 1 :(得分:2)

没有经过测试,但他的问题似乎在于这三个功能

function GenNodes() {
        // Rest of code
    nodes[i]= new SeedNode()
}

function SeedNode() {
        //Rest of code
        DrawNode(this,this.x,this.y)
} 

function DrawNode(node,x_cen,y_cen) {

    // Rest of code
    console.log(nodes.indexOf(node))
    seeds.fillText(nodes.indexOf(node),x_cen,y_cen)
}

在函数GenNodes中,您尝试填充nodes数组但这取决于从SeedNode函数返回。同样,此SeenNode依赖于DrawNode函数的返回。这意味着一次DrawNode&amp; SeedNode已执行,然后将元素放入nodes数组中。但在放置元素之前,您正在检查indexOf nodesDrawNode数组中的元素{{1}}。

所以它返回-1,我认为根据indexOf

上的文档,这是正确的

答案 2 :(得分:2)

你有一个范围问题。永远不会在nodes找到它的任何地方声明DrawNode()。要解决此问题,请在任何函数之外声明nodes

var testMe = [];
function doSomething() {
  doTheThing();
}

function doTheThing() {
  testMe[0] = "hi";
  testMe[1] = "there";
  doTheOtherThing();
}

function doTheOtherThing() {
  console.log("This works");
  console.log(testMe.indexOf("there"));
}

doSomething();