2013-10-08 3 views
6

Я некоторые JSON, отформатированный как:Сортировка JSON (по конкретному элементу) по алфавиту

places =[ 
    { 
     "city":"Los Angeles", 
     "country":"USA", 
    }, 
    { 
     "city":"Boston", 
     "country":"USA", 
    }, 
    { 
     "city":"Chicago", 
     "country":"USA", 
    }, 
] 

и так далее ...

Я пытаюсь разобраться в этом алфавитном порядке BY CITY и Возникают проблема сделав. Я считаю, что корень моей проблемы, похоже, определяет порядок символов (по сравнению с числами). Я пробовал просто:

places.sort(function(a,b) { 
    return(a.city) - (b.customInfo.city); 
    }); 

все же это вычитание не знает, что делать. Кто-нибудь может мне помочь?

ответ

21

К сожалению, в JavaScript нет общей функции «сравнения», чтобы вернуть подходящее значение для sort(). Я бы написал функцию compareStrings, которая использует операторы сравнения, а затем использовать ее в функции сортировки.

function compareStrings(a, b) { 
    // Assuming you want case-insensitive comparison 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 

    return (a < b) ? -1 : (a > b) ? 1 : 0; 
} 

places.sort(function(a, b) { 
    return compareStrings(a.city, b.city); 
}) 
+0

святого дерьма, Матти, я должен тебе пиво. Почему выполняется сравнение между

+2

Сравнение работает, потому что '<' и друзья определены для использования лексикографического упорядочения для строк. Внутри он проверяет каждый соответствующий символ и когда он находит два разных значения Unicode, он возвращает, что приводит к упорядочению «словаря». Вот почему я добавил называть toLowerCase() на всякий случай, потому что само сравнение сравнивает только значения кодовых точек. Он не проверяет случай. –

4

Решение Matti's правильно, но вы можете написать это проще. Вам не нужен дополнительный вызов функции; вы можете поместить логику непосредственно в обратный вызов sort.

Для сортировки без учета регистра:

places.sort(function(a, b) { 
    a = a.city.toLowerCase(); 
    b = b.city.toLowerCase(); 

    return a < b ? -1 : a > b ? 1 : 0; 
}); 

Для регистрозависимой сортировки:

places.sort(function(a, b) { 
    return a.city < b.city ? -1 : a.city > b.city ? 1 : 0; 
}); 
Смежные вопросы