根据键值确定 JavaScript 数组的优先级



我有一个Javascript数组

var airports = [
{
    iata: "CPT",
    city: "Cape Town",
    airport: "Cape Town International",
    country: "South Africa",
    priority: 9
},
{
    iata: "HLA",
    city: "Johannesburg",
    airport: "Lanseria",
    country: "South Africa",
    priority: 1
},
{
    iata: "JNB",
    city: "Johannesburg",
    airport: "OR Tambo International",
    country: "South Africa",
    priority: 9
},
];

请注意:最终.js文件列出了 3000 多个机场。

我正在尝试让自动完成返回优先结果。

在上面的例子中,如果用户开始输入"约翰内斯堡",它必须根据"优先级"值进行优先级排序,例如JNB,或Tambo International应始终显示在HLA,Lanseria上方。

当前自动完成功能根据其在数组中列出的位置显示结果。

小提琴可以在这里找到:https://jsfiddle.net/cgaybba/17p7uyvf/

试试这段代码可能对你有用

var airportArray = [
    {
        iata: "CPT",
        city: "Cape Town",
        airport: "Cape Town International",
        country: "South Africa",
        priority: 9
    },
    {
        iata: "HLA",
        city: "Johannesburg",
        airport: "Lanseria",
        country: "South Africa",
        priority: 1
    },
    {
        iata: "JNB",
        city: "Johannesburg",
        airport: "OR Tambo International",
        country: "South Africa",
        priority: 9
    },
    {
        iata: "DUR",
        city: "Durban",
        airport: "King Shaka International",
        country: "South Africa",
        priority: 9
    },
    {
        iata: "BFN",
        city: "Bloemfontein",
        airport: "Bram Fischer International",
        country: "South Africa",
        priority: 9
    },
    {
        iata: "PLZ",
        city: "Port Elizabeth",
        airport: "Port Elizabeth Airport",
        country: "South Africa",
        priority: 8
    },
    {
        iata: "AGZ",
        city: "Aggeneys",
        airport: "Aggeneys Airport",
        country: "South Africa",
        priority: 6
    },
    {
        iata: "GRJ",
        city: "George",
        airport: "George Airport",
        country: "South Africa",
        priority: 7
    },
    {
        iata: "ELS",
        city: "East London",
        airport: "Ben Schoeman Airport",
        country: "South Africa",
        priority: 7
    }
];
 var airportArray = airportArray.sort(function(a, b) {                  
                return (b.priority || 0) - (a.priority || 0);
            });   
$(function() {
    function custom_source(request, response) {
        var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
        response($.grep(airportArray, function(value) {
            return matcher.test(value.label) || matcher.test(value.value) || matcher.test(value.airport) || matcher.test(value.country);
        }));
    }
    $("#input_1_1").autocomplete({
        minLength: 3,
        source: custom_source,
        ookupLimit: 3,
        clearCache: true,
        sortBeforeLimit: function(suggestions) {
            var sorted = suggestions.sort(function(a, b) {
                    alert(a.priority);
                return (a.priority || 0) - (b.priority || 0);
            });
            return sorted;
        },
        focus: function(event, ui) {
            // Text inside INPUT while selecting airport
            $("#input_1_1").val(ui.item.city + ', ' + ui.item.airport + ' (' + ui.item.iata + '), ' + ui.item.country);
            return false;
        },
        select: function(event, ui) {
            // Text inside INPUT AFTER selecting
            $("#input_1_1").val(ui.item.city + ' (' + ui.item.iata + ')');
            $("#input_1_2").val(ui.item.iata);
            return false;
        }
    })
        .autocomplete("instance")._renderItem = function(ul, item) {
        return $('<li>')
            .append('<div class="result-row">' + item.city + ', ' + item.airport + ' (' + item.iata + '), ' + item.country + '</div>')
            .appendTo(ul);
    };
});
您可以使用

自定义比较函数对$.grep的结果进行排序:

let temp = $.grep(airportArray, function(value)  
    return matcher.test(value.label) || matcher.test(value.value) || matcher.test(value.airport) || matcher.test(value.country);
}
response(temp.sort((airportA, airportB) => {
    if(airportA.priority < airportB.priority){
        return -1;
    }
    else if(airportA.priority > airportB.priority){
        return 1;
    }
    else{
        return 0;
    }
}));

相关内容

最新更新