Адаптация ответа @chriskelly.
В большинстве ответов не учитывается, что цена не будет отсортирована должным образом, если значение будет в десяти тысячах и ниже или более миллиона.JS сортирует по алфавиту.Здесь довольно хорошо ответили: Почему JavaScript не может сортировать "5, 10, 1" и здесь Как правильно отсортировать массив целых чисел .
В конечном итогемы должны сделать некоторую оценку, если поле или узел, по которому мы сортируем, является числом.Я не говорю, что использование parseInt()
в этом случае является правильным ответом, отсортированные результаты более важны.
var homes = [{
"h_id": "2",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": "62500"
}, {
"h_id": "1",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": "62510"
}, {
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": "162500"
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": "319250"
}, {
"h_id": "6",
"city": "Dallas",
"state": "TX",
"zip": "75000",
"price": "556699"
}, {
"h_id": "5",
"city": "New York",
"state": "NY",
"zip": "00010",
"price": "962500"
}];
homes.sort(fieldSorter(['price']));
// homes.sort(fieldSorter(['zip', '-state', 'price'])); // alternative
function fieldSorter(fields) {
return function(a, b) {
return fields
.map(function(o) {
var dir = 1;
if (o[0] === '-') {
dir = -1;
o = o.substring(1);
}
if (!parseInt(a[o]) && !parseInt(b[o])) {
if (a[o] > b[o]) return dir;
if (a[o] < b[o]) return -(dir);
return 0;
} else {
return dir > 0 ? a[o] - b[o] : b[o] - a[o];
}
})
.reduce(function firstNonZeroValue(p, n) {
return p ? p : n;
}, 0);
};
}
document.getElementById("output").innerHTML = '' + JSON.stringify(homes, null, '\t') + '
';
<div id="output">
</div>
Скрипка для проверки с