@IceDevil
На пути от верстки до фронта

Как отсортировать объекты?

Есть массив с объектами
У каждого объекта есть уникальный id и id его предыдущего элемента (prevId), так же у одного объекта prevId равен 'none'

Как отсортировать их перед выводом в последовательности -
none - всегда первый,
за ним следует объект у которого prevId равен id объекта с prevId = none
далее объект с prevId который равен id предыдущего объекта и т.д.

в общем из такого массива
id = 40 - prevId = 22
id = 22 - prevId = 52
id = 4364 - prevId = 40
id = 4 - prevId = none
id = 52 - prevId = 4

сделать такой
id = 4 - prevId = none
id = 52 - prevId = 4
id = 22 - prevId = 52
id = 40 - prevId = 22
id = 4364 - prevId = 40
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега JavaScript
Ответ на текущий овпрос:
Примерно так:
var objectList = [
    {id:40, prevId:22},
    {id:22, prevId:52},
    {id:4364, prevId:40},
    {id:4, prevId:'none'},
    {id:52, prevId:4}
];

function sortSequential(objectList, coupleFrom, coupleTo, minValue) {
    var sorted = [];
    var couplingFound = true;
    var couplingValue = minValue;
    
    while(couplingFound) {
        couplingFound = false;
        
        for (var i=0; i<objectList.length; i++) {
            if (objectList[i][coupleTo] === couplingValue) {
                sorted.push(objectList[i]);
                couplingValue = objectList[i][coupleFrom];
                couplingFound = true;
                break;
            }
        }
    }
    
    return sorted;
}

objectList = sortSequential(objectList, 'id', 'prevId', 'none');


Ответ на изначальный вопрос о сортировке объектов по значению одного из элементов:
Подозреваю, что речь идет все же о массиве с объектами.
Если это не так, то уточните более подробно структуру вашего объекта. Желательно с примером.
Что же касается сортировки массива с объектам, то функция sort (которая доступна для любого массива) принимает в качестве аргумента пользотваельскую функцию для сортировки (документация).
Пример использования:
var objectList = [
    {id:1, parentId:2},
    {id:2, parentId:4},
    {id:3, parentId:1},
    {id:4, parentId:'none'}
];

objectList.sort(function(someObject, otherObject) { 
    if (someObject.parentId === 'none') {
        return -1;
    }
    
    return someObject.parentId >= otherObject.parentId ? -1 : 1;
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы