如何将一个数组与多个数组匹配,并返回最接近的数组

How to match an array with multiple arrays and return the closest array

本文关键字:数组 最接近 返回 一个      更新时间:2023-09-26

我正在尝试制作一个饮料web应用程序,用户输入成分,然后返回饮料或鸡尾酒的名称。

我的drinks数组是这样的:

 // 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;
    }
}
}

我做错了什么?还有更好的方法吗?

提前感谢,

罗伯特

好的,我会这样做:在你的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;
    }
}
...

查看这个完整的示例。顺便说一下,我强烈建议使用一个更有意义的结构为drinksdifference数组,如建议的VisioN,也许也使函数返回某种数据结构(最接近的饮料索引和成分数组,例如),而不是一个描述字符串。