Сортировочный комплекс json - PullRequest
0 голосов
/ 21 апреля 2020

Друзья, у меня есть следующий объект в javascript:

{
    id:     {0: 3,      1: 2,       2: 1}
    amount: {0: 1000,   1: 5000,    2: 300},
    date:   {0: "aaa",  1: "bbb",   2: "ccc"}
}

как мне отсортировать его по убыванию по ключу "сумма"? Объекты "id" и "date" должны быть переставлены в соответствии с отсортированной суммой

Ожидаемый результат:

{
    id:     {0: 2,      1: 3,       2: 1}
    amount: {0: 5000,   1: 1000,    2: 300},
    date:   {0: "bbb",  1: "aaa",   2: "ccc"}
}

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Если честно, с данными в этом формате работать очень плохо. Мое предложение было бы, если есть какой-либо способ изменить структуру, это было бы очень предпочтительно. Однако, если это не так, вы можете манипулировать данными в работоспособном формате, сортировать их, а затем возвращать их в исходный формат, например:

let data = {
    id:     {0: 3,      1: 2,       2: 1},
    amount: {0: 1000,   1: 5000,    2: 300},
    date:   {0: "aaa",  1: "bbb",   2: "ccc"}
}

// group data by index i.e. id[0], amount[0], and date[0] should be grouped together
let grouped = Object.entries(data.id).reduce((res, curr) => {
  let [key, value] = curr;
  res.push([data.id[key], data.amount[key], data.date[key]]);
  return res;
}, []);


// sort by index 1 (amount) descending
let sorted = grouped.sort((a,b) => {
  return b[1] - a[1];
});

// take sorted data and put back into original structure
let final = sorted.reduce((res, curr, index) => {
  let [id, amount, date] = curr;
  res.id[index] = id;
  res.amount[index] = amount;
  res.date[index] = date;
  return res;
}, {id: {}, amount: {}, date: {}});

console.log(final);
0 голосов
/ 21 апреля 2020

Сортируйте ключи amount по amount и используйте порядок этих отсортированных ключей, чтобы воссоздать объекты в новом порядке:

const x = {
    id:     {0: 3,      1: 2,       2: 1}, 
    amount: {0: 1000,   1: 5000,    2: 300},
    date:   {0: "aaa",  1: "bbb",   2: "ccc"}, 
};

const newX = Object.keys(x.amount)
  .sort((a, b) => x.amount[b] - x.amount[a])
  .reduce((a, c, i) => ({
    id: { ...a.id, [i]: x.id[c] },
    amount: { ...a.amount, [i]: x.amount[c] },
    date: { ...a.date, [i]: x.date[c] },
 }), { id: {}, amount: {}, date: {} }) ;

console.log(newX);
0 голосов
/ 21 апреля 2020

Я бы сначала порекомендовал изменить макет данных. Это не в своего рода дружественном формате. Вместо этого я бы порекомендовал следующее:

[
    {id: 2, amount: 5000, date: "bbb"},
    {id: 3, amount: 1000, date: "aaa"},
    {id: 1, amount: 300, date: "ccc"},
]

Как только это будет сделано, вы можете отсортировать массив на подключ с помощью метода sortBy, например: https://caolan.github.io/async/v3/sortBy.js.html

Пример:

sortBy(obj2, (row) => row.amount, (result) => {
    console.log(result);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...