我有一个看起来像这样的JSON数组:
var all_messages = [{
name: 'user1',
replying_to: '',
message: 'xxxxx'
},
{
name: 'user3',
replying_to: 'user4',
message: 'xxxxx'
},
{
name: 'user2',
replying_to: 'user1',
message: 'xxxxxx'
},
{
name: 'user5',
replying_to: '',
message: 'xxxxxx'
},
{
name: 'user1',
replying_to: 'user2',
message: 'xxxxx'
}]
我想使用Javascript根据name
和replying_to
重新排序此数组,以便对象的顺序看起来像对话线程。理想情况下,阵列会在其名称下面有针对用户的回复,而没有特定用户的消息将位于数组的末尾。换句话说,我希望数组看起来像这样:
var sorted_messages = [{
name: 'user1',
replying_to: '',
message: 'xxxxx'
},
{
name: 'user2',
replying_to: 'user1',
message: 'xxxxx'
},
{
name: 'user1',
replying_to: 'user2',
message: 'xxxxxx'
},
{
name: 'user3',
replying_to: 'user4',
message: 'xxxxx'
},
{
name: 'user5',
replying_to: '',
message: 'xxxxx'
}]
到目前为止,我已经尝试创建一个嵌套的for
循环来检查名称匹配但我仍然试图让循环工作。这个循环的另一个问题是,如果一个人更多地回复另一个人,它会停止正确更新数组并开始复制消息。
var names = [];
var sorted_comments = [];
//extract names to use for filter
for (var i = 0; i < all_messages.length; i++) {
names.push(all_messages[i].name);
//apply code to remove duplicate names...
}
for (var i = 0; i < all_messages.length; i++) {
for (var j = 0; j < names.length; j++) {
if (names[j] == all_messages[i].name) {
sorted_comments.push(all_messages[i]);
} else if (names[j] == all_messages[i].replying_to) {
sorted_comments.push(all_messages[i])
}
}
}
实现这种过滤的优雅方式是什么?
答案 0 :(得分:1)
试试这个
var sorted_messages = all_messages.sort(function(a,b){
return a.name > b.name && a.replying_to >= b.name
})