Как отсортировать объект по вложенному значению - PullRequest
0 голосов
/ 13 апреля 2020

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

{
 3782034: {
    title: "",
    other_data: "",
    last_modified: {
      author: "",
      timestamp: 1584915554
    }
 },
 3981728: {
    title: "",
    other_data: "",
    last_modified: {
      author: "",
      timestamp: 1584915731
    }
 }
}

Моя цель состоит в том, чтобы ключи верхнего уровня объекта были упорядочены по метке времени. Это может привести либо к правильно упорядоченному объекту, либо к массиву упорядоченных ключей первого уровня (например, [3981728, 3782034]).

Вот пример, с которым я работал, но не смог заставить его работать.

Object.entries(data).sort((a, b) => {
  return a[1].last_modified.timestamp > b[1].last_modified.timestamp
})

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

Ответы [ 3 ]

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

Объекты в JavaScript неупорядочены, поэтому вам придется использовать упорядоченную структуру данных, такую ​​как массив, для достижения того, что вы ищете.

Один из способов go об этом передать ключ верхнего уровня и временную метку для сортировки по цепочке. После сортировки по отметке времени вы можете перестроить объект, и у вас останется упорядоченный массив объектов.

const values = {
  3782034: {
    title: "",
    other_data: "",
    last_modified: {
      author: "",
      timestamp: 1584915554,
    },
  },
  3981728: {
    title: "",
    other_data: "",
    last_modified: {
      author: "",
      timestamp: 1584915731,
    },
  },
};

let sorted = Object.keys(values)
  .map((key) => [key, values[key].last_modified.timestamp])
  .sort((a, b) => b[1] - a[1])
  .reduce((p, c) => [...p, {
    [c[0]]: values[c[0]]
  }], []);

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

Я обнаружил, что смог добиться этого с помощью функции loda sh orderBy.

const sortedKeys = orderBy(Object.keys(data), key => data[key].last_modified.timestamp, "desc")

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

//some React component
return (
  <article>
    <p>View Data</p>
    {sortedKeys.map(key => {
      return <p>Last Modified: {data[key].title}</p>
    })}
  </article>
)
0 голосов
/ 13 апреля 2020

Попробуйте это ниже, предполагая, что ваша json является переменной, определенной как данные:

let data_keys = Object.keys(data);
let output = data_keys.map(function (key) {
    return [key, data[key]['last_modified']['timestamp']];
}).sort(function (x, y) {
    return y[1] - x[1];
}).map(function (obj) {
    return obj.splice(0, 1)[0]
});
console.log(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...