Napisałem funkcję porównującą do sortowania elementów tablicy, która uwzględnia polskie znaki, ale wydaje mi się, że można to zrobić rozsądniej/wydajniej/krócej. Macie jakieś inne rozwiązania tego zagadnienia?
Moje rozwiązanie:
var tab = new Array('Jabłko', 'czereśnia', 'mandarynka--', 'Żurawina', 'Gruszka', 'jabłko', 'Mandarynka-', 'śliwa', 'Banan', 'Malina', 'Truskawka'); function sortPL(a, b) { a = a.toLowerCase(); b = b.toLowerCase(); order = new Array('a', 'ą', 'b', 'c', 'ć', 'd', 'e', 'ę', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'ł', 'm', 'n', 'ń', 'o', 'ó', 'p', 'r', 's', 'ś', 't', 'u', 'w', 'y', 'z', 'ź', 'ż'); length = a.length > b.length ? b.length : a.length; for ( i=0; i <= length; i++ ) { if ( i == length ) { return a.length > b.length ? 1 : -1; } if ( order.indexOf(a[i]) != -1 && order.indexOf(b[i]) != -1 ) { if ( order.indexOf(a[i]) > order.indexOf(b[i]) ) { return 1; } else if ( order.indexOf(a[i]) < order.indexOf(b[i]) ) { return -1; } } else { if ( a[i] != b[i] ) { return ( a[i] > b[i] ) - ( a[i] < b[i] ); } } } } console.debug(tab); // przed console.debug(tab.sort(sortPL)); // po console.debug(tab.sort()); // domyślne sortowanie JS
Kod
Przed:
["Jabłko", "czereśnia", "mandarynka--", "Żurawina", "Gruszka", "jabłko", "Mandarynka-", "śliwa", "Banan", "Malina", "Truskawka"]
Po:
["Banan", "czereśnia", "Gruszka", "Jabłko", "jabłko", "Malina", "Mandarynka-", "mandarynka--", "śliwa", "Truskawka", "Żurawina"]
Domyślne sortowanie JS bez funkcji porównującej:
["Banan", "Gruszka", "Jabłko", "Malina", "Mandarynka-", "Truskawka", "czereśnia", "jabłko", "mandarynka--", "śliwa", "Żurawina"]
["Jabłko", "czereśnia", "mandarynka--", "Żurawina", "Gruszka", "jabłko", "Mandarynka-", "śliwa", "Banan", "Malina", "Truskawka"]
Po:
["Banan", "czereśnia", "Gruszka", "Jabłko", "jabłko", "Malina", "Mandarynka-", "mandarynka--", "śliwa", "Truskawka", "Żurawina"]
Domyślne sortowanie JS bez funkcji porównującej:
["Banan", "Gruszka", "Jabłko", "Malina", "Mandarynka-", "Truskawka", "czereśnia", "jabłko", "mandarynka--", "śliwa", "Żurawina"]