从函数返回数组

35
--由Elliot B解决。谢谢!也可以考虑其他修改。
这是结果。谢谢大家的快速回答!http://dl.dropbox.com/u/18785762/Rust/index.html 我正在用JavaScript编写一个游戏,并且希望将匹配块ID与地图编译器中的文件分开存放在一个单独的.js文件中,以便我可以轻松编辑。然而,这些ID存储在一个数组中,我似乎无法正确使用返回函数。有什么帮助吗?

drawmap.js:

function drawmap() {
    
    var images = BlockID();
    
    var level = [
    "ssssssssssssssssssssss",
    "sgggggggggCCCCCdddddss",
    "ssssssssss     sssssss"
    ];

    var top = 100;
    var left = 100;
    var mytop = top;
    var myleft = left;
    for (y=0; y<level.length; ++y) {
        var row = level[y];
        for (x=0; x < row.length; ++x) {
            var c = row.charAt(x);
            if(c != ' ') {
                img_create(images[c], mytop, myleft);
            }
            mytop += 13;
            myleft += 27;
        }
        mytop = top + (y+1)*13;
        myleft = left - (y+1)*27;
    }
}

mapread.js:

function BlockID() {
    var IDs = new Array();
        images['s'] = "Images/Block_01.png";
        images['g'] = "Images/Block_02.png";
        images['C'] = "Images/Block_03.png";
        images['d'] = "Images/Block_04.png";
    return IDs;
}

1
那么哪里出了问题呢?你在控制台日志中是否收到了错误信息? - Mike Brant
2
将“images”更改为“IDs”,它就可以工作了... - Bergi
4
我会使用"[ ]"或"{ }",而不是"new Array()"或"new Object()"来代替。 - Ian
1
我同意@ianpgall - 因此我发了这篇帖子 :) - mplungjan
4个回答

49

最小限度,更改此内容:

function BlockID() {
    var IDs = new Array();
        images['s'] = "Images/Block_01.png";
        images['g'] = "Images/Block_02.png";
        images['C'] = "Images/Block_03.png";
        images['d'] = "Images/Block_04.png";
    return IDs;
}

变为:

function BlockID() {
    var IDs = new Object();
        IDs['s'] = "Images/Block_01.png";
        IDs['g'] = "Images/Block_02.png";
        IDs['C'] = "Images/Block_03.png";
        IDs['d'] = "Images/Block_04.png";
    return IDs;
}

有几个需要指出的修复。 首先,在您原始的函数中未定义images,因此给它分配属性值会引发错误。我们通过将images更改为IDs来纠正这一点。 其次,您想要返回一个Object,而不是一个Array。可以将属性值赋值给对象,就像关联数组或哈希表一样 - 无法对数组执行此操作。因此,我们将var IDs = new Array();的声明更改为var IDs = new Object();

经过这些更改,您的代码将运行良好,但可以进一步简化。您可以使用简写符号(即对象字面量属性值缩写)立即创建对象并返回它:

function BlockID() {
    return {
            "s":"Images/Block_01.png"
            ,"g":"Images/Block_02.png"
            ,"C":"Images/Block_03.png"
            ,"d":"Images/Block_04.png"
    };
}

5
这里应该使用对象,而不是数组。 - pimvdb
谢谢!现在可以工作了。15分钟冷却时间结束后,我会接受这个答案。 - Aido
@pimvdb是正确的。@AidanEdwards如果您不使用整数作为索引,那么Array()就没有意义了。 - Imp
2
@Aidan Edwards:数组基本上是带有索引的列表(通过 [0] 等访问它们)。对象是通用的键/值对,这就是您正在使用的内容。 - pimvdb

14

您的 BlockID 函数使用了未定义的变量 images,这会导致错误。此外,在此处不应使用一个 Array - JavaScript 的键值映射是普通对象:

function BlockID() {
    return {
        "s": "Images/Block_01.png",
        "g": "Images/Block_02.png",
        "C": "Images/Block_03.png",
        "d": "Images/Block_04.png"
    };
}

8
更整洁:
function BlockID() {
  return {
    "s":"Images/Block_01.png",
    "g":"Images/Block_02.png",
    "C":"Images/Block_03.png",
    "d":"Images/Block_04.png"
   }
}

或者只是
var images = {
  "s":"Images/Block_01.png",
  "g":"Images/Block_02.png",
  "C":"Images/Block_03.png",
  "d":"Images/Block_04.png"
}

我想把ID保存在一个单独的文件中,我可能会使用第一个。 - Aido

0

考虑到在JavaScript中,数组也是对象,因此可以这样编写:

function BlockID() {
    return new Array(
        "Images/Block_01.png", 
        "Images/Block_02.png", 
        "Images/Block_03.png", 
        "Images/Block_04.png" 
       );
    }

这段代码将在浏览器窗口中显示数组的内容

window.onload=function(){
var s="";
var ar = BlockID(); //function return array
for(el in ar){
    s+=ar[el]+"</br>";
}
document.body.innerHTML=s; 
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接