Как отсортировать массив объектов на основе длины вложенного массива в JavaScript - PullRequest
5 голосов
/ 20 февраля 2010

У меня есть массив объектов в javascript, каждый из которых, в свою очередь, имеет массив:

{
    category: [ 
        { name: "Cat1", elements : [ 
            { name: name, id: id } ] 
        },
        { name: "Cat2", elements : [ 
            { name: name, id: id },
            { name: name, id: id },
            { name: name, id: id } ] 
        }, 
        { name: "Cat3", elements : [ 
            { name: name, id: id },
            { name: name, id: id } ] 
        }
    ]
}

Я бы хотел отсортировать массив «категория» по количеству объектов во вложенном массиве «элементы».

Например, после сортировки вышеуказанный объект может выглядеть так (по убыванию):

{
    category: [ 
        { name: "Cat2", elements : [ 
            { name: name, id: id },
            { name: name, id: id },
            { name: name, id: id } ] 
        }, 
        { name: "Cat3", elements : [ 
            { name: name, id: id },
            { name: name, id: id } ] 
        },
        { name: "Cat1", elements : [ 
            { name: name, id: id } ] 
        }

    ]
}

Мне интересно, возможно ли сделать это, используя метод sort () javascript. Есть предложения?

Заранее спасибо!

Ответы [ 2 ]

15 голосов
/ 20 февраля 2010

Метод sort принимает функцию, в которой вы можете определить, как сравнивать два элемента.Вот соответствующая документация .

compareFunction Определяет функцию, которая определяет порядок сортировки.Если опущено, массив сортируется лексикографически (в порядке словаря) в соответствии со строковым преобразованием каждого элемента.

Если предоставляется функция CompareFunction, элементы массива сортируются в соответствии с возвращаемым значением функции сравнения.,Если a и b - это два сравниваемых элемента, то:

  • Если compareFunction (a, b) меньше 0, сортируйте a по более низкому индексу, чем b.

  • Если compareFunction (a, b) возвращает 0, оставьте a и b неизменными по отношению друг к другу, но отсортированные по всем различным элементам.Примечание: стандарт ECMAscript не гарантирует такое поведение, и, следовательно, не все браузеры (например, версии Mozilla, датируемые по крайней мере 2003 годом) соблюдают это.

  • Если функция сравнения (a, b)больше 0, сортировка b по более низкому индексу, чем a.

Пример кода

var sorted_categories = original.category.sort(function (one, other) {
   //a - b is 
   //   0 when elements are the same
   //  >0 when a > b
   //  <0 when a < b
   return one.elements.length - other.elements.length;
});
0 голосов
/ 20 февраля 2010
var category = [ 
        { name: "Cat1", elements : [ 
            { name: name, id: id } ] 
        },
        { name: "Cat2", elements : [ 
            { name: name, id: id },
            { name: name, id: id },
            { name: name, id: id } ] 
        }, 
        { name: "Cat3", elements : [ 
            { name: name, id: id },
            { name: name, id: id } ] 
        }
];

function myAbcSort(a, b){
    if(a.elements.length > b.elements.length) {
        return -1;
    } else {
        return 1;
    }
}
category.sort(myAbcSort);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...