Вопрос по javascript, arrays, sorting, object, nested – Как отсортировать массив вложенных объектов в JavaScript

1

У меня есть такой массив

var array = [{
    order: 3,
    sub - array: [{
        order: 2
    },{
        order: 1
    }]
},{
    order: 2,
    sub - array: [{
        order: 2
    },{
        order: 1
    }]
}];​

Теперь я хочу отсортировать полную коллекцию по атрибутуorderтак что оба внешние а также внутренние массивы должны быть отсортированы на основе порядка атрибутов.

Окончательный результат должен выглядеть следующим образом.

var array = [{
    order: 2,
    sub - array: [{
        order: 1
    },{
        order: 2
    }]
},{
    order: 3,
    sub - array: [{
        order: 1
    },{
        order: 2
    }]
}];​
@ Матт пойнт vijay tyagi
возможный дубликатHow to sort an array of javascript objects? Rob W
Структура @jbabey может иметь любое количество уровней, извините, не получил часть ответов на вопросы. vijay tyagi
В будущем, пожалуйста, уделите больше времени написанию или форматированию вашего поста. Помощь по форматированию можно найтиhere Matt

Ваш Ответ

3   ответа
1

Ты можешь использоватьAgile.js для такого рода вещей.
На самом деле вы передаете выражение вместо обратного вызова, оно обрабатывает вложенные свойства и выражения javascript очень приятным способом.

Usage: _.orderBy(array, expression/callback, reverse[optional])

Example:

var orders = [
  { product: { price: 91.12, id: 1 } },
  { product: { price: 79.21, id: 2 } },
  { product: { price: 99.90, id: 3 } },
  { product: { price: 19.99, id: 4 } }
];

_.orderBy(orders, 'product.price');
// →  [orders[3], orders[1], orders[0], orders[2]]

_.orderBy(orders, '-product.price');
// → [orders[2], orders[0], orders[1], orders[3]]
1

использованиеArray.prototype.sort и позвони наarray и впоследствии на каждом элементеarray с соответствующей функцией сравнения. Примерно так должно работать:

array.sort(function (e1, e2) {
  return (e1.order - e2.order);
});

array.forEach(function(e) {
  e["sub-array"].sort(function (e1, e2) {
    return (e1.order - e2.order);
  });
});
4
var propertySort = function(a, b){
    return a.order > b.order ? 1 : (a.order < b.order ? -1 : 0);
    }

var reorder = function(arr){
    var l = arr.length;
    while (l--){
        if (arr[l]['sub-array']){
            reorder(arr[l]['sub-array']);
        }
    }
arr.sort(propertySort);
};

reorder(arr);

console.log(arr);

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

Похожие вопросы