javascript - 检查变量属于哪个数组的最有效方法

我有一堆信息页面。目前,我在每个不同的页面/主题上都有一个对话,但是我希望将它们减少到适合5个主题。当前,我有此脚本(以及实际链接上的类似脚本),该脚本检查hash标签并相应地带上正确的信息页+执行为页面进行对话的功能:

$(document).ready(function() {
var hash = window.location.hash.substr(7);
var locs = ["koti", "espoonk", "luonto", "tyo", "kulttuuri", "kalajarvi", "dalby", "oittaa", "mgolf", "smeds", "marketanpuisto", "hognas", "pirttimaki", "ekumeenink", "kaisankoti", "solvalla", "velskola", "korpilampi", "nuuksio", "majalampi", "juvanmalmi", "rinnekoti", "hognasa", "pellaksenmaki", "royla", "ketunkorpi", "kulloonmaki", "gobbacka", "kalliomaki", "nepperi", "viiskorpi", "antinmaki", "niipperinn", "metsamaa", "odilampi", "lakisto", "lahnus", "koskelonsolmu", "isannansolmu", "auroranportti", "juvansolmu"];
if(navigator.appName == "Microsoft Internet Explorer") {
    if ($.inArray(hash, locs) != -1) {
            window.location = "indexie.html#kohde-" + hash;
    }
    else {
            window.location = "indexie.html"
    }
}
else if ($.inArray(hash, locs) != -1) {
    var toLoad = 'info/'+hash+'.html';
    $('#info').load(toLoad);
    changeTopic(hash);
    $('#topicid').val(hash);
}
else {
    $('#info').load('info/help.html');
}
});


如您所见,我当前在locs下有所有不同的主题,但是我不希望这么多不同的对话继续进行。 changeTopic(hash)用于通过在查询字符串 xmlhttp.open("POST", "gettopic.php?t="+topic,true);中插入散列来进行对话

尽管gettopic.php具有以下行 $t=$_GET["t"]; $inf = "SELECT * FROM comments WHERE page = '".$t."' ORDER BY time ASC";

哪种方法在共同主题下整理不同页面最有效?我猜我可以做5个不同的数组,并使用5个单独的 else if语句检查哈希是否属于它们中的任何一个,但这似乎很笨拙。也许可以在gettopic.php中将这些不同的页面组合在一起吗?

//编辑

所以我可以

var hash = window.location.hash.substr(7);
var topic1 = ["loc1", "loc2", "loc3"];
var topic2 = ["loc4", "loc5", "loc6"];
var topic3 = ["loc7", "loc8", "loc9"];


但这会使我不得不逐一检查每个对象(也要同时检查5个而不是3个)

if ($.inArray(hash, topic1) != -1) {
    var toLoad = 'info/'+hash+'.html';
    $('#info').load(toLoad);
    changeTopic(topic1);
    $('#topicid').val(topic1);
}
else if ($.inArray(hash, topic2) != -1) {
    var toLoad = 'info/'+hash+'.html';
    $('#info').load(toLoad);
    changeTopic(topic2);
    $('#topicid').val(topic2);
}
else if ($.inArray(hash, topic3) != -1) {
    var toLoad = 'info/'+hash+'.html';
    $('#info').load(toLoad);
    changeTopic(topic3);
    $('#topicid').val(topic3);
}


我想要的是一种更简单的方法来检查哈希所属的数组,然后只运行一个将运行 changeTopic(theArrayHashIsIn)的脚本

最佳答案

好的,我看到的是一件绝对惊人的事情,不要把这当作侮辱,但是请确保在将$ t用作该查询字符串之前,先将其转义!我们不需要偶然在互联网上运行的另一个伟哥网站。

无论如何,尝试一下...我想可能是您想要的更多。请记住,“ true”值可以是任何值。.我只是踢了“ true”而已。

var tree = {
    topic1: {
        conversation1: true,
        conversation2: true
    },
    topic2: {
        conversation3: true
    }
}

var flatMap = {
    conversation1: 'topic1',
    conversation2: 'topic2',
    conversation3: 'topic3'
}


现在,它可能适用于您..如果哈希为'conversation1',则可以通过flatMap进行检查。

var hash = window.location.hash.substr(7); //lets say this is "conversation1"
if(flatMap[hash]) {
    //This is one of your conversations, and it'll give you "topic1" as the branch its under.
    //as well as giving you the validation that this is indeed a conversation
}


或者,如果您要获取要打开的分支的引用。

var branch = tree[flatMap[hash]]


例如,这将为您提供一个对象,

{
    conversation1: true,
    conversation2: true
}


或者,如果您想参考存储在该位置的数据。

var data = tree[flatMap[hash]][hash]; //This will just be 'true', because that's all we've stored.


合理?