我有两个来自 Php 的 Javascript 数组。我将这些数组合并为一个数组。
所有数组的元素都有 created_at
值 (Laravel)。我想按 created_at
问题:无论他们的日期如何。第一个数组的元素永远不会出现在第二个数组的元素之后
示例:B 有最新日期。但即便如此,C(来自第二个数组)发生在 B 之后。
The problem is although I merged these two arrays into one array. Javascript still thinks "there are two arrays. I should sort first array's elements then those of second array."
我要做的是:
history.push(...response.data[0]); // first array's values
history.push(...response.data[1]); // second array's values
history.sort((a, b) => {
return a.created_at - b.created_at;
});
所以,历史就像
[
// Comes from first array
{
name: 'A',
created_at: '08/09/2021'
},
// Comes from first array
{
name: 'B',
created_at: '15/09/2021'
},
// This third element comes from second array.
{
name: 'C',
created_at: '08/09/2021'
}
]
我期望这样的结果:
新的排序历史:
{
name: 'A',
created_at: '08/09/2021'
},
{
name: 'C',
created_at: '08/09/2021'
},
{
name: 'B',
created_at: '15/09/2021'
}
但是 Javascript 最初对第一个数组的元素进行排序。之后,对第二个数组的元素进行排序,结果是:
{
name: 'A',
created_at: '08/09/2021'
},
{
name: 'B',
created_at: '15/09/2021'
},
{
name: 'C',
created_at: '08/09/2021'
},
最佳答案
您可以array#concat
您的数组并使用Schwartzian transform
通过将 created_at
转换为可以按字典顺序排序的 YYYY-MM-DD
格式对数组进行排序。
const arr1 = [{name: 'A', created_at: '08/09/2021'}],
arr2 = [{name: 'B', created_at: '15/09/2021'}, {name: 'C', created_at: '08/09/2021'}],
result = arr1.concat(arr2)
.map(o => [o.created_at.replace(/(..)\/(..)\/(....)/, '$3-$2-$1'), o])
.sort((a,b) => a[0].localeCompare(b[0]))
.map(([,o]) => o);
console.log(result)
关于Javascript 无法正确排序包含两个数组值的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69108359/