Pracuję z platformą e-commerce, która nie ma możliwości zmiany kolejności opcji w polach atrybutów produktu. To naprawdę jest do bani, ponieważ aby wstawić nową opcję, musisz usunąć wszystkie istniejące i zacząć od nowa. Próbuję zrobić to po stronie klienta. Oto, co pracuję z (ten dotyczący rozmiar buta):Opis sortowania() compareFunction
- 9 EE
- 9 1/2 EE
- 10 EE
- 10 1/2 EE
- 11 EE
- 11 1/2 EE
- 9 EEEE
- 9 1/2 D
- 9 1/2 EEEE
- 10 EEEE
- 10 1/2 EEEE
- 11 EEEE
- 9d
- 11 1/2 EEEE
Te są rzeczywiście tekst niektórych <option>
S w formie. Format wartości jest X Y Z
gdzie:
X
jest liczbą całkowitąY
jest napis „1/2” i nie może być obecnyZ
kod jest list, który jest albo „D ”, "E", "SEE" lub "EEEE" i nie może być obecny
żądanej kolejności powyższe będzie to:
- 9d
- 9 1/2 D
- 9 EE
- 9 1/2 EE
- 9 EEEE
- 9 1/2 EEEE
- 10 EE
- 10 1/2 EE
- 10 EEEE
- 10 1/2 EEEE
- 11 EE
- 11 1/2 EE
- 11 EEEE
- 11 1/2 EEEE
nauczyłem się trochę o sort()
funkcji JavaScript, ale nie były w stanie w pełni zrozumieć, jak porównanie funkcja, którą możesz przekazać działa.Mam to do tej pory:
<select>
<option>9 EE</option>
<option>9 1/2 EE</option>
<option>10 EE</option>
<option>10 1/2 EE</option>
<option>11 EE</option>
<option>11 1/2 EE</option>
<option>9 EEEE</option>
<option>9 1/2 D</option>
<option>9 1/2 EEEE</option>
<option>10 EEEE</option>
<option>10 1/2 EEEE</option>
<option>11 EEEE</option>
<option>9 D</option>
<option>11 1/2 EEEE</option>
</select>
Zacząłem kodu pobranego z tej odpowiedzi: https://stackoverflow.com/a/667198/398242
$("select").html($("option").sort(function (a, b) {
return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
}));
Jakie sortuje rzeczy tak (nie działa nawet pierwszy kryteria):
- 10 1/2 EE
- 10 1/2 eeee
- 10 EE
- 10 EEEE
- 11 1/2 EE
- 11 1/2 EEEE
- 11 EE
- 11 EEEE
- 9 1/2 D
- 9 1/2 EE
- 9 1/2 EEEE
- 9d
- 9 EE
- 9 EEEE
widzę, że w javascript '11' > '9'
powraca false
, która w żaden sposób nie czyni dla mnie sens.
MDN describes the compare function argument jako taki, a ja niby dostać go:
function compare(a, b) {
if (a is less than b by some ordering criterion)
return -1;
if (a is greater than b by the ordering criterion)
return 1;
// a must be equal to b
return 0;
}
... ale nie mam pojęcia jak do tego dostosować, aby dopasować moje wymagania. Próbowałem kilku rzeczy, ale po prostu mam wrażenie, że strzelam w ciemności. Próbowałem pokazać, że poświęciłem trochę czasu, aby spróbować zrozumieć ten problem. Chciałbym dowiedzieć się więcej, ale na razie chciałbym rozwiązać ten problem.
http://jsfiddle.net/DnwJ6/ Jakieś wskazówki?
Myślę, że tutaj rozwiązaniem jest jakoś normalizacja zarówno "a" jak i "b" do formatu '\ d \ d (1/2 | 0/0) [az] *' przed porównaniem ich –
'" 11 ">" 9 "=== false' ma doskonały sens. Porównujesz ** ciągi **. Spróbuj przekonwertować najpierw na numery: – Ian
Checkout http://jsfiddle.net/arunpjohny/ZnLJh/ –