0

私は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);
} 
4

3 に答える 3

1

かなり良さそうです。私が提案できる唯一のこと (そしてこれは非常に小さな改善です) は、次のように、ループする前に連想配列の長さをキャッシュすることです。

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ループの外に出たコードは、検索結果が「見つからない」場合にのみ実行されることを意味します。

于 2012-05-14T14:07:59.857 に答える
0

この方法を試してください:

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!");
    }
}

これは、単語ごとに 1 つの定義がある場合にのみ機能します。連想配列をさらに活用したい場合は、ディクショナリ変数を次のように変更します。

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.'}],
        };

もちろん、それに応じてコードを変更します

于 2012-05-14T14:21:29.670 に答える
0

これが私の見解です:

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!");
}

または、 final の代わりに、if見つかったアイテムの数を常に書き込むことができます。

document.write(found.toString() + " items found");
于 2012-05-15T00:33:46.120 に答える