如何根据嵌套值对对象进行排序

时间:2020-04-13 10:59:30

标签: javascript object

我有一个与下面类似的对象,需要根据深度嵌套的值对顶级键进行排序。

{
 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 :(得分:0)

假设您的json是定义为data的变量,请尝试以下操作:

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)

答案 1 :(得分:0)

JavaScript中的对象是无序的,因此您必须使用有序的数据结构(例如数组)来实现所需的内容。

解决此问题的一种方法是传递顶级密钥和时间戳,以在链中进行排序。根据时间戳排序后,您可以重建对象,然后剩下对象的有序数组。

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);

答案 2 :(得分:0)

我发现我可以使用lodash 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>
)