0

ユーザーが材料を入力してから、飲み物またはカクテルの名前を返す飲み物の Web アプリケーションを作成しようとしています。

私の飲み物の配列は次のようになります。

 // Drinks
 var drinks = new Array(
    [0,['Whisky on the Rocks'],['whisky','ice']],
    [1,['Vodka on the Rocks'],['vodka','ice']]
);

私はこれをうまくやっていますが、最初の要素のみを返しています:

function compare(myDrink) {
var difference = [];
difference[0]  = [];
difference[0][0] = [];
var dCount = drinks.length;
for (x = 0;x < dCount; x++) { 
    jQuery.grep(drinks[x][2], function(el) {
        if (jQuery.inArray(el, myDrink) == -1){
             difference[x][0].push(el);
             difference[x][1] = difference[x][0].length;
        }
    });
    var theDrink = difference[x][0].join(',');
    if (theDrink == ''){
        return drinks[x][1];
    } else {
        var diff = 'The Difference is: ' + difference[x][1] + ' Missing: ' + theDrink;
        return diff;
    }

}
}

私は何を間違っていますか?そして、それを行うためのより良い方法はありますか?

前もって感謝します、

ロバート

4

1 に答える 1

1

わかりました、私はこのようなことをします:forループで、見つけた最小距離とそのインデックスを追跡します:

....
var closest = -1;
var minDifference = 99;
for (x = 0;x < dCount; x++) {
    difference[x]  = [];
    difference[x][0] = [];
    difference[x][1] = 0;
    jQuery.grep(drinks[x][2], function(el) {
        if (jQuery.inArray(el, myDrink) == -1){
            difference[x][0].push(el);
            difference[x][1] = difference[x][0].length;
        }
    });
    if (difference[x][1] < minDifference) {
        minDifference = difference[x][1];
        closest = x;
    }
}
...

完全な例については、このフィドルを参照してください。ちなみに、VisioN で提案されているように、drinksanddifference配列にもっと意味のある構造を使用することを強くお勧めします。また、関数が説明文字列の代わりに何らかのデータ構造 (たとえば、最も近い飲み物のインデックスと食材の配列など) を返すようにすることもお勧めします。 .

于 2013-01-17T11:09:00.590 に答える