我无法通过KEY(DESC)对以下对象进行排序。 然后,按" notesList.id"对每个项目进行排序。财产(DESC)。
然后,对于" 2017/04/17" notesList项目,这是预期订单:
var myNotes = {
"customNotes":{
"2017/04/17":{
"concernedDate":"2017/04/17",
"notesList":[
{
"id":48,
"title":"Title 48"
},
{
"id":12,
"title":"Title 12"
},
{
"id":57,
"title":"Title 57"
}
]
},
"2017/02/30":{
"concernedDate":"2017/02/30",
"notesList":[
{
"id":92,
"title":"Title 92"
}
]
},
"2017/03/14":{
"concernedDate":"2017/03/14",
"notesList":[
{
"id":92,
"title":"Title 92"
}
]
}
}
}
//Convert the OBJECT to an ARRAY
var tmpArr = Object.keys(myNotes.customNotes);
//Sort (Not working)
tmpArr.sort((a, b) => a > b ? a : b);
//Convert back the ARRAY to an OBJECT
Object.keys(myNotes.customNotes).sort((a, b) => a > b ? a : b).map(k => myNotes.customNotes[k]);
我错过了什么?我非常感谢你
答案 0 :(得分:1)
您可以使用thenBy.js
喜欢这个
data.sort(
firstBy(function (v1, v2) { return v1.name.length - v2.name.length; })
.thenBy(function (v1, v2) { return v1.population - v2.population; })
.thenBy(function (v1, v2) { return v1.id - v2.id; })
);
您还可以使用此库按属性名称进行排序
喜欢这个
data.sort(
firstBy(function (v) { return v.name.length; })
.thenBy("population")
.thenBy("id")
);
答案 1 :(得分:1)
您的sort
函数应返回零,正数或负数。你只是返回值。另请注意,这会将customNotes
转换为数组,因为无法对对象进行排序。如果您不希望发生这种情况,可以在customNotes
中使用已排序的键数组维护另一个键,并使用此数组在customNotes
中查找值。另一种方法是使用新的Map
对象。 Map
支持排序的密钥。
试试这个:
var myNotes = {
"customNotes":{
"2017/04/17":{
"concernedDate":"2017/04/17",
"notesList":[
{
"id":48,
"title":"Title 48"
},
{
"id":12,
"title":"Title 12"
},
{
"id":57,
"title":"Title 57"
}
]
},
"2017/02/30":{
"concernedDate":"2017/02/30",
"notesList":[
{
"id":92,
"title":"Title 92"
}
]
},
"2017/03/14":{
"concernedDate":"2017/03/14",
"notesList":[
{
"id":92,
"title":"Title 92"
}
]
}
}
}
var myNewNotes = {};
myNewNotes.customNotes = Object.keys(myNotes.customNotes).sort((a, b) => {
if (a < b) return -1
else if (a > b) return 1;
else return 0;
}).map(key => sorted(myNotes.customNotes[key]));
function sorted(note) {
note.notesList = note.notesList.sort((a, b) => {
if (a.id < b.id) return -1;
else if (a.id > b.id) return 1;
else return 0;
})
return note;
}
console.log(myNewNotes)
&#13;
答案 2 :(得分:1)
我在代码中发现了一些看似不合适的事情。
tmpArr.sort((a, b) => a > b ? a : b);
返回tmpArr的排序版本。它不会修改myNotes对象。Object.keys(myNotes.customNotes).sort(...
将从myNotes.customNotes返回一个对象数组,而不是像myQuotes那样具有与myNotes相同结构的对象。假设您想获得一个数组,您只需要修复排序函数,并在map函数中对notesList进行排序。所以你的代码应该是这样的:
var myNotes={customNotes:{"2017/04/17":{concernedDate:"2017/04/17",notesList:[{id:48,title:"Title 48"},{id:12,title:"Title 12"},{id:57,title:"Title 57"}]},"2017/02/30":{concernedDate:"2017/02/30",notesList:[{id:92,title:"Title 92"}]},"2017/03/14":{concernedDate:"2017/03/14",notesList:[{id:92,title:"Title 92"}]}}};
var res = Object.keys(myNotes.customNotes)
.sort((a, b) => a < b)
.map(k => {
let currNote = myNotes.customNotes[k];
currNote.notesList.sort((a, b) => a.id < b.id)
return myNotes.customNotes[k];
});
console.log(res);
但是,如果你打算保留myNotes的结构,我会建议你使用reduce函数。请参阅下面的代码:
var myNotes={customNotes:{"2017/04/17":{concernedDate:"2017/04/17",notesList:[{id:48,title:"Title 48"},{id:12,title:"Title 12"},{id:57,title:"Title 57"}]},"2017/02/30":{concernedDate:"2017/02/30",notesList:[{id:92,title:"Title 92"}]},"2017/03/14":{concernedDate:"2017/03/14",notesList:[{id:92,title:"Title 92"}]}}};
// MY SOLUTION
var sortedNotes = Object.keys(myNotes.customNotes)
.sort((a, b) => a < b)
.reduce((acc, val, _, arr) => {
acc[val] = myNotes.customNotes[val];
acc[val].notesList.sort((a, b) => a.id < b.id);
return acc;
},{});
console.log(sortedNotes);