繁体   English   中英

有没有一种优雅的方法来在JavaScript中搜索关联数组?

[英]Is there an elegant way to searching an associative array In JavaScript?

我是JavaScript的新手,并且希望对代码段进行一些建设性的批评。 本示例使用用户输入的值搜索关联数组。 有没有更好的方法来解决此问题; 在仍然使用关联数组的情况下,什么是更优雅的解决方案? 谢谢。

var myObject = [
    {id: 1, word: 'ant', definition: 'an insect with eight legs.'}, 
    {id: 2, word: 'cake', definition: 'a food made with flour and sugar.'},
    {id: 3, word: 'house', definition: 'a building where a family lives.'},
];

function search(arg){
    var count = 0;
    for (var i = 0; i <= myObject.length; i++) {
        if (myObject[i].word == arg) {
            document.write(myObject[i].id + " - " + myObject[i].word + " - " + 
                               myObject[i].definition + "<br>"); 
            count += 1;
        }
        else {
            if (count != 1 &&
                    myObject[i].word != arg &&
                    i == myObject.length - 1) {

                document.write("NOT FOUND!");
            }
        }
    }
}

var arg = prompt("Search For An Entry");
if (arg != null && arg.length != 0) {
    search(arg);
} 

看起来还不错 我唯一可以建议(这是一个非常小的改进)会遍历它,就像在此之前缓存关联数组的长度:

for (var i = 0, len = myObject.length; i < len; i++) {

您也可以将最后一个if语句移到for循环之外,以检查是否未找到搜索参数,如下所示:

for (var i = 0, len = myObject.length; i < len; i++) {
    if (myObject[i].word == arg) {
        document.write(myObject[i].id + " - " + myObject[i].word + " - " + myObject[i].definition + "<br>");
        count += 1;
    }

    if(i == len-1 && count > 0) return;
}

document.write("NOT FOUND!");

如果在结束for循环之前找到任何搜索参数,则此代码将退出搜索功能。 这意味着,仅在搜索结果为“未找到”时,才会运行在for循环外退出的所有代码。

尝试这种方式:

var myObject = {'ant': {id: 1, word: 'ant', definition: 'an insect with eight legs.'}, 
        'cake' : {id: 2, word: 'cake', definition: 'a food made with flour and sugar.'},
        'house' : {id: 3, word: 'house', definition: 'a building where a family lives.'},
        };

function search(arg){
    var count = 0;
    if (myObject[arg] != undefined)
    {
        document.write(myObject[arg].id + " - " + arg + " - " + myObject[arg].definition + "<br>");
    }
    else
    {
        document.write("NOT FOUND!");
    }
}

仅当每个单词有一个定义时,这才起作用。 如果您想拥有更多功能,并且仍然能够召唤关联数组的功能,则可以将dictionary变量更改为以下形式:

var myObject = {'ant': [{id: 1, word: 'ant', definition: 'an insect with eight legs.'}, {id: 666, word: 'ant', definition: 'progeny of the devil'}], 
        'cake' : [{id: 2, word: 'cake', definition: 'a food made with flour and sugar.'}],
        'house' : [{id: 3, word: 'house', definition: 'a building where a family lives.'}],
        };

当然要相应地更改代码

这是我的看法:

var i, found = 0;

for (i = 0; i < myArray.length; i++) {
    if(myArray[i].word === arg) {
        document.write(myArray[i].id + " - " + myArray[i].word + " - " + myArray[i].definition + "<br>");
        found++;
    }
}

if(found === 0) {
    document.write("None found!");
}

或代替最终的if ,您可以总是写出找到的项目数:

document.write(found.toString() + " items found");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM