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

时间:2011-08-30 07:08:37

标签: javascript arrays

我有一堆信息页面。目前我对每个不同的页面/主题进行了对话,但我想减少它们以适应5个主题。目前我有这个脚本(和实际链接上的类似),它检查哈希标记并相应地带来正确的信息页面+执行为页面带来对话的功能:

$(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)的单个脚本

2 个答案:

答案 0 :(得分:1)

好吧,我看到的一个非常引人注目的事情......并且不要将此视为侮辱,但请确保在使用该查询字符串之前逃脱$ t!我们不需要另外在互联网上运行的伟哥网站。

无论如何,试试这个...我认为它可能更符合您的需求。请记住,“真正的”价值可以是任何东西......我只是把'真实'投入了踢。

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.

有意义吗?

答案 1 :(得分:1)

除非我误解,否则您正在寻找一种将位置哈希(应该等于locs中的值)映射到主题的方法。在JS中,您可以使用任何对象,数组索引运算符和字符串索引来实现此目的。类似地,PHP中的数组可以有字符串索引,因此您可以使用它们将字符串映射到任何内容。

PHP:

$loc_topics = array(
    'koti' => 'topic1',
    'espoonk' => 'topic2',
    ///...
);
if (isset($loc_topics[$hash])) {
    $topic = $loc_topics[$hash];
    ...
} else {
    ...
}

JS:

var loc_topics = {
    koti: 'topic1',
    espoonk: 'topic2',
    ...
};

var topic = loc_topics[hash];
if (topic) {
    var toLoad = 'info/'+hash+'.html';
    $('#info').load(toLoad);
    changeTopic(topic);
    $('#topicid').val(topic);
} else {
    /* unknown loc/hash */
    $('#info').load('info/help.html');
}

如果您已在PHP中定义数组,则可以使用json_encode生成相应的JS数据结构,因此您不会复制信息并遇到可能导致的问题。在这种情况下,您将创建一个生成JS脚本的PHP脚本:

var loc_topics = <?php echo json_encode($loc_topics) ?>;
...

如果您更改主题,位置或它们之间的关系,您还可以在数据库中将相同的信息存储在与位置和主题相关的表中,这样可以使事情更易于管理。

如果您有locstopics表:

CREATE TABLE locs_topics (
    loc INT UNSIGNED NOT NULL,
    topic INT UNSIGNED NOT NULL,
    INDEX (loc, topic),
    INDEX (topic, loc),
    FOREIGN KEY loc REFERENCES locs (id),
    FOREIGN KEY topic REFERENCES topics (id)
) Engine=InnoDB;

要查询此表:

SELECT t.name 
  FROM locs AS l
    LEFT JOIN locs_topics AS lt ON lt.loc = l.id
    LEFT JOIN topics AS t ON t.id = lt.topic
  WHERE l.name = ?

如果给定loc没有主题(但定义了loc),则返回NULL。如果没有loc,则返回0行。

如果没有locstopics表(尽管这会导致不一致,例如,如果某行中的字段值存在拼写错误):

CREATE TABLE locs_topics (
    loc VARCHAR(32) NOT NULL,
    topic VARCHAR(32) NOT NULL,
    INDEX (loc, topic),
    INDEX (topic, loc)
) Engine=InnoDB;

查询更简单:

SELECT topic
  FROM locs_topics
  WHERE loc = ?

如果没有loc的主题,或者未定义loc,则返回0行。