Сортировка массива объектов JavaScript по свойству - PullRequest
1172 голосов
/ 11 июня 2009

Я прочитал следующие объекты, используя Ajax, и сохранил их в массиве:

var homes = [
    {
        "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": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];

Как создать функцию для сортировки объектов по свойству price в порядке по возрастанию или по убыванию с использованием только JavaScript?

Ответы [ 27 ]

1 голос
/ 06 декабря 2013

Для сортировки массива необходимо определить функцию компаратора. Эта функция всегда будет отличаться в зависимости от желаемого шаблона или порядка сортировки (т. Е. По возрастанию или по убыванию).

Давайте создадим некоторые функции, которые сортируют массив по возрастанию или по убыванию, который содержит объект или строку или числовые значения.

function sorterAscending(a,b) {
    return a-b;
}

function sorterDescending(a,b) {
    return b-a;
}

function sorterPriceAsc(a,b) {
    return parseInt(a['price']) - parseInt(b['price']);
}

function sorterPriceDes(a,b) {
    return parseInt(b['price']) - parseInt(b['price']);
}

Сортировка чисел (по алфавиту и по возрастанию):

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();

Сортировка чисел (по алфавиту и по убыванию):

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();

Сортировка чисел (по номерам и по возрастанию):

var points = [40,100,1,5,25,10];
points.sort(sorterAscending());

Сортировка чисел (по номерам и по убыванию):

var points = [40,100,1,5,25,10];
points.sort(sorterDescending());

Как и выше, используйте метод sorterPriceAsc и sorterPriceDes с вашим массивом с нужным ключом.

homes.sort(sorterPriceAsc()) or homes.sort(sorterPriceDes())
1 голос
/ 07 марта 2018

Вам понадобятся две функции

function desc(a, b) {
 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}

function asc(a, b) {
  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}

Затем вы можете применить это к любому свойству объекта:

 data.sort((a, b) => desc(parseFloat(a.price), parseFloat(b.price)));

let data = [
    {label: "one", value:10},
    {label: "two", value:5},
    {label: "three", value:1},
];

// sort functions
function desc(a, b) {
 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}

function asc(a, b) {
 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}

// DESC
data.sort((a, b) => desc(a.value, b.value));

document.body.insertAdjacentHTML(
 'beforeend', 
 'DESCending sorted' + JSON.stringify(data) +'
); // ASC data.sort ((a, b) => asc (a.value, b.value)); document.body.insertAdjacentHTML ( 'Beforeend', ' ASCending отсортировано
' + JSON.stringify(data) +'
' );
1 голос
/ 08 февраля 2017

Вот слегка измененная версия элегантной реализации из книги «JavaScript: хорошие части».

ПРИМЕЧАНИЕ : эта версия by является стабильной . Сохраняет порядок первой сортировки при выполнении следующей цепочки сортировки.

Я добавил isAscending параметр к нему. Также преобразовал его в ES6 стандарты и "новые" хорошие детали, как рекомендовано автором.

Вы можете сортировать по возрастанию, а также по убыванию и сортировать по цепочке по нескольким свойствам.

const by = function (name, minor, isAscending=true) {
    const reverseMutliplier = isAscending ? 1 : -1;
    return function (o, p) {
        let a, b;
        let result;
        if (o && p && typeof o === "object" && typeof p === "object") {
            a = o[name];
            b = p[name];
            if (a === b) {
                return typeof minor === 'function' ? minor(o, p) : 0;
            }
            if (typeof a === typeof b) {
                result = a < b ? -1 : 1;
            } else {
                result = typeof a < typeof b ? -1 : 1;
            }
            return result * reverseMutliplier;
        } else {
            throw {
                name: "Error",
                message: "Expected an object when sorting by " + name
            };
        }
    };
};

let s = [
    {first: 'Joe',   last: 'Besser'},
    {first: 'Moe',   last: 'Howard'},
    {first: 'Joe',   last: 'DeRita'},
    {first: 'Shemp', last: 'Howard'},
    {first: 'Larry', last: 'Fine'},
    {first: 'Curly', last: 'Howard'}
];

// Sort by: first ascending, last ascending
s.sort(by("first", by("last")));    
console.log("Sort by: first ascending, last ascending: ", s);     // "[
//     {"first":"Curly","last":"Howard"},
//     {"first":"Joe","last":"Besser"},     <======
//     {"first":"Joe","last":"DeRita"},     <======
//     {"first":"Larry","last":"Fine"},
//     {"first":"Moe","last":"Howard"},
//     {"first":"Shemp","last":"Howard"}
// ]

// Sort by: first ascending, last descending
s.sort(by("first", by("last", 0, false)));  
console.log("sort by: first ascending, last descending: ", s);    // "[
//     {"first":"Curly","last":"Howard"},
//     {"first":"Joe","last":"DeRita"},     <========
//     {"first":"Joe","last":"Besser"},     <========
//     {"first":"Larry","last":"Fine"},
//     {"first":"Moe","last":"Howard"},
//     {"first":"Shemp","last":"Howard"}
// ]
0 голосов
/ 30 октября 2014

Я недавно написал универсальную функцию для управления этим для вас, если вы хотите использовать ее.

/**
 * Sorts an object into an order
 *
 * @require jQuery
 *
 * @param object Our JSON object to sort
 * @param type Only alphabetical at the moment
 * @param identifier The array or object key to sort by
 * @param order Ascending or Descending
 *
 * @returns Array
 */
function sortItems(object, type, identifier, order){

    var returnedArray = [];
    var emptiesArray = []; // An array for all of our empty cans

    // Convert the given object to an array
    $.each(object, function(key, object){

        // Store all of our empty cans in their own array
        // Store all other objects in our returned array
        object[identifier] == null ? emptiesArray.push(object) : returnedArray.push(object);

    });

    // Sort the array based on the type given
    switch(type){

        case 'alphabetical':

            returnedArray.sort(function(a, b){

                return(a[identifier] == b[identifier]) ? 0 : (

                    // Sort ascending or descending based on order given
                    order == 'asc' ? a[identifier] > b[identifier] : a[identifier] < b[identifier]

                ) ? 1 : -1;

            });

            break;

        default:

    }

    // Return our sorted array along with the empties at the bottom depending on sort order
    return order == 'asc' ? returnedArray.concat(emptiesArray) : emptiesArray.concat(returnedArray);

}
0 голосов
/ 26 апреля 2017

Для сортировки по множеству полей объекта. Введите имя вашего поля в arrprop массиве, например ["a","b","c"] затем передайте второй параметр arrsource фактический источник, который мы хотим отсортировать.

function SortArrayobject(arrprop,arrsource){
arrprop.forEach(function(i){
arrsource.sort(function(a,b){
return ((a[i] < b[i]) ? -1 : ((a[i] > b[i]) ? 1 : 0));
});
});
return arrsource;
}
0 голосов
/ 31 января 2015
homes.sort(function(a, b){
  var nameA=a.prices.toLowerCase(), nameB=b.prices.toLowerCase()
  if (nameA < nameB) //sort string ascending
    return -1 
  if (nameA > nameB)
    return 1
  return 0 //default return value (no sorting)
})
0 голосов
/ 03 апреля 2016

Привет, прочитав эту статью, я создал sortComparator для своих нужд, с возможностью сравнивать более одного атрибута json и хочу поделиться им с вами.

Это решение сравнивает только строки в порядке возрастания, но решение может быть легко расширено для каждого поддерживаемого атрибута: обратный порядок, другие типы данных, использование локали, приведение и т. Д.

var homes = [{

    "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": "5",
    "city": "New York",
    "state": "NY",
    "zip": "00010",
    "price": "962500"

}];

// comp = array of attributes to sort
// comp = ['attr1', 'attr2', 'attr3', ...]
function sortComparator(a, b, comp) {
    // Compare the values of the first attribute
    if (a[comp[0]] === b[comp[0]]) {
        // if EQ proceed with the next attributes
        if (comp.length > 1) {
            return sortComparator(a, b, comp.slice(1));
        } else {
            // if no more attributes then return EQ
            return 0;
        }
    } else {
        // return less or great
        return (a[comp[0]] < b[comp[0]] ? -1 : 1)
    }
}

// Sort array homes
homes.sort(function(a, b) {
    return sortComparator(a, b, ['state', 'city', 'zip']);
});

// display the array
homes.forEach(function(home) {
    console.log(home.h_id, home.city, home.state, home.zip, home.price);
});

и результат

$ node sort
4 Bevery Hills CA 90210 319250
5 New York NY 00010 962500
3 Dallas TX 75201 162500

и другой сорт

homes.sort(function(a, b) {
    return sortComparator(a, b, ['city', 'zip']);
});

с результатом

$ node sort
4 Bevery Hills CA 90210 319250
3 Dallas TX 75201 162500
5 New York NY 00010 962500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...