基于多个字符串对数组进行排序

时间:2018-04-17 09:18:00

标签: javascript arrays sorting

我有一个看起来像这样的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根据namereplying_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])
         }
     }
}

实现这种过滤的优雅方式是什么?

1 个答案:

答案 0 :(得分:1)

试试这个

var sorted_messages = all_messages.sort(function(a,b){
    return a.name > b.name && a.replying_to >= b.name
})