2012-05-13 18 views
4

データのソートが必要です。 検索フィールドに「piz」と入力します。私は、「ピズ」を含むすべてのエントリーを受け取り、配列を取得します。Javascriptは、文字列の先頭とアルファベット順にアルファベット順に一致します。

私は今、次の順序でそれらを表示したい:

pizza 
pizzeria 
apizzetto 
berpizzo 

まず私はアルファベット順に入力した内容含まれていたもの、次にアルファベット順に入力した内容で始まるアイテム。私はアルファベット順に並べ替える

代わり場合、私は取得

apizzetto 
berpizzo 
pizza 
pizzeria 

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

答えて

5

データを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/

+0

はい、 'else if indexOf ...> 0'以外の要素を削除する必要があります。 – georg

+0

非常に良い。魅力のように動作します。小文字の一致を保証するためにいくつかの変更を加えなければならなかった。しかしそれはまったく別の話題です。どうもありがとうございました! –

+0

@ thg435 - 質問を慎重に読んだ場合、最初の配列は検索語を含む単語だけにスクリーニングされています。 – jfriend00

0

ここでは別の一つだ:

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); 
2

右の完全なソリューションです:

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; 
    }); 
}; 
+0

これは正解とマークする必要があります。 – nickb

関連する問題