我有一个与下面类似的对象,需要根据深度嵌套的值对顶级键进行排序。
{
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
})
我的努力是,每当我将排序后的键映射回对象时,排序后的顺序就不会持久。
答案 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>
)