将两个对象组合成一个对象并按时间戳排序

时间:2017-10-12 00:14:23

标签: javascript laravel object vue.js

在Laravel中,我使用这种方法将集合组合在一起并作为一个集合返回。

$collection = $messages->merge($texts)->sortByDesc('created_at')

如果我dd($colection),它会显示所有组合和排序的Collection对象。

然后我尝试通过ajax将其发送到vue,但是,数据再次分开。所以我的对象看起来像这样:

item: {
   messages: [
      0: { ... }
      1: { ... }
      2: { ... }
      3: { ... }
   ],
   texts: [
      0: { ... }
      1: { ... }
   ]
}

这是因为return response()->json('item' => '$collection')将它们再次分隔为消息和文本。

我试着像这样组合它们,但是它覆盖了值(我假设因为id是相同的)。

vm item = this;

// in response of ajax get,
.then(function(response) {
   var item  = response.data.item;
   Object.assign(vm.item.messages, vm.item.texts);
});

将文本组合成消息并按时间戳排序的正确方法是什么?他们都在第一级对象中创建了create_at,如下所示:

messages: [
   0: { created_at: ... }
],
texts: [
   0: { created_at: ... }
]

更新:在icepickle的回答之后,使用concat,我能够将它们组合在messages数组中。现在,我对created_at值有一个问题,因为它们被转换为字符串。这是一些测试数据。这是我订购后得到的:

messages: [
   0: { 
     msg: 'hello',
     created_at: "2017-10-12 00:48:59"
   },
   1: { 
     msg: 'mellow',
     created_at: "2017-10-11 16:05:01"
   },
   2: { 
     msg: 'meow',
     created_at: "2017-10-11 15:07:06"
   },
   4: {
     msg: 'test'
     created_at: "2017-10-11 17:13:24"
   }
   5: {
     msg: 'latest'
     created_at: "2017-10-12 00:49:17"
   }
],

1 个答案:

答案 0 :(得分:1)

concat数组是不够的,然后排序?

有点像

max

或在es6

let result = ([]).concat(item.messages, item.texts);

然后在结果上调用sort

let result = [...item.messages, ...item.texts]

// in place sort, result will be sorted, and return the sorted array
result.sort((a, b) => a.created_at - b.created_at);