10

いくつかのデータを並べ替えるのに助けが必要です。検索フィールドに「piz」と入力するとします。代わりに、「piz」を含むすべてのエントリを配列します。

次の順序で表示したいと思います。

pizza 
pizzeria
apizzetto
berpizzo

最初にアルファベット順に入力したものから始まるアイテム、次にアルファベット順に入力したものを含むアイテム。

代わりに、アルファベット順に並べ替えると、次のようになります。

apizzetto
berpizzo
pizza 
pizzeria

誰かがこれを行う方法を知っていますか?ご協力いただきありがとうございます。

4

5 に答える 5

14

データを2つの配列に分割できます。1つは入力で始まり、もう1つはそうではありません。それぞれを個別に並べ替えてから、2つの結果を組み合わせます。

var data = [
    'pizzeria',
    'berpizzo',
    'apizzetto',
    'pizza'
];

function sortInputFirst(input, data) {
    var first = [];
    var others = [];
    for (var i = 0; i < data.length; i++) {
        if (data[i].indexOf(input) == 0) {
            first.push(data[i]);
        } else {
            others.push(data[i]);
        }
    }
    first.sort();
    others.sort();
    return(first.concat(others));
}

var results = sortInputFirst('piz', data);

あなたはそれがここで働くのを見ることができます:http://jsfiddle.net/jfriend00/nH2Ff/

于 2012-05-13T15:50:56.847 に答える
7

正しい完全な解決策は次のとおりです。

var data = [
    'pizzeria',
    'berpizzo',
    'apizzetto',
    'pizza'
];

var _sortByTerm = function (data, term) {
    return data.sort(function (a, b) {
       return a.indexOf(term) < b.indexOf(term) ? -1 : 1;
    });
};

var result = _sortByTerm(data, 'piz');

オブジェクトの並べ替えが必要な場合は、次の関数を使用します。

var _sortByTerm = function (data, key, term) {
     return data.sort(function (a, b) {
        return a[key].indexOf(term) < b[key].indexOf(term) ? -1 : 1;
     });
 };
于 2016-03-20T13:03:30.327 に答える
2

もう1つあります:

var str = 'piz';
var arr = ['apizzetto','pizzeria','berpizzo','pizza'];

arr.sort(function(a,b) {
    var bgnA = a.substr(0,str.length).toLowerCase();
    var bgnB = b.substr(0,str.length).toLowerCase();

    if (bgnA == str.toLowerCase()) {
        if (bgnB != str.toLowerCase()) return -1;
    } else if (bgnB == str.toLowerCase()) return 1;
    return a < b ? -1 : (a > b ? 1 : 0);
});

console.log(arr);
于 2012-05-13T15:55:11.577 に答える
2

reduceの使用:

const data = ['pizzeria', 'berpizzo', 'pizza', 'apizzetto'];

function sortInputFirst(input, data) {
    data.sort();
    const [first, others] = data.reduce(([a, b], c) => (c.indexOf(input) == 0 ? [[...a, c], b] : [a, [...b, c]]), [[], []]);
    return(first.concat(others));
}

const output = sortInputFirst('piz', data);
console.log(output)
于 2019-04-02T15:52:04.543 に答える
0

投票数の多い回答を使用して、検索関数に正規化されたデータセットを使用させる方法は次のとおりです。文字列を比較する前にアクセントを削除し、大文字と小文字を区別しません。

function getAutocompleteNormalizedMatches(userInput, array) {
    const normalizedInput = getNormalizedString(userInput);
    let normalizedListItem;
    let startsWith = [];
    let anywhere = [];
    for (let i = 0; i < array.length; i++) {
        normalizedListItem = getNormalizedString(array[i]);
        if (normalizedListItem.indexOf(normalizedInput) === 0) {
            startsWith.push(array[i])
        } else if (normalizedListItem.includes(normalizedInput)) {
            anywhere.push(array[i])
        }
    }
    startsWith.sort();
    anywhere.sort();
    return startsWith.concat(anywhere);
}


const getNormalizedString = function (str) {
    str = str.replace(/\s+/g, " ").trim();
    return (str ? removeDiacritics(str.toLowerCase()) : "");
};

removeDiacritics()関数を取得するには、このリンクを参照してください。必要がない場合は、かなりの無駄なスペースが必要になります。JavaScriptを使用して文字列内のアクセント発音区別符号を削除します。

于 2020-03-10T23:05:46.563 に答える