首页 > 解决方案 > 按另一个数组对较大的 javascript 数组进行排序并将值移动到数组的顶部

问题描述

如果之前有人问过这个问题,我深表歉意,但我希望根据另一个数组的标准对 javascript 数组进行排序。我知道条件数组中包含的所有值都将在某个较大的数组中,但我需要将条件数组中的值移动到列表的顶部。

例如,我有一个更大的数组,看起来像这样:

array = [
  {_id: "123", username: "username1",platform: "xbox"},
  {_id: "124", username: "username2",platform: "xbox"},
  {_id: "125", username: "username3",platform: "ps4"},
  {_id: "126", username: "username4",platform: "pc"},
  {_id: "127", username: "username5",platform: "ps4"},
  {_id: "128", username: "username6",platform: "pc"}
    ];

然后我需要根据较小数组的标准对这个较大的数组进行排序,然后将这些值移动到较大数组的顶部

所以在这种情况下,标准数组将是

critarray = [
 {_id: "124", username: "username2",platform: "xbox"},
 {_id: "127", username: "username5",platform: "ps4"},
 {_id: "128", username: "username6",platform: "pc"},
];

较大的数组将按如下方式排序:

array = [
  {_id: "124", username: "username2",platform: "xbox"},
  {_id: "127", username: "username5",platform: "ps4"},
  {_id: "128", username: "username6",platform: "pc"},
  {_id: "123", username: "username1",platform: "xbox"},
  {_id: "125", username: "username3",platform: "ps4"},
  {_id: "126", username: "username4",platform: "pc"},
    ];

此外,只要将条件数组中的所有对象都移到顶部,顺序并不重要。

任何帮助将不胜感激!

谢谢

标签: javascriptarrayssorting

解决方案


过滤和连接

由于您不关心这两个组以外的顺序,并且您知道较大的数组包含较小的所有元素,而不是排序,您可以只过滤掉所有critarray项目而array不是连接critarrayarray

let array = [
    {_id: "123", username: "username1",platform: "xbox"},
    {_id: "124", username: "username2",platform: "xbox"},
    {_id: "125", username: "username3",platform: "ps4"},
    {_id: "126", username: "username4",platform: "pc"},
    {_id: "127", username: "username5",platform: "ps4"},
    {_id: "128", username: "username6",platform: "pc"}
      ];

let  critarray = [
   {_id: "124", username: "username2",platform: "xbox"},
   {_id: "127", username: "username5",platform: "ps4"},
   {_id: "128", username: "username6",platform: "pc"},
  ];

// all items not in crit array
let arrayFiltered = array.filter(item => !critarray.find(i => i._id === item._id) )

// concat critarray first, then rest
let newArr = critarray.concat(arrayFiltered)

console.log(newArr)

这假定_id是唯一标识符。

或排序

或者,如果您想对数组进行适当的排序,您也可以从中创建一个Setidcitarray并将其包含在该集合中作为排序的基础:

let array = [
    {_id: "123", username: "username1",platform: "xbox"},
    {_id: "124", username: "username2",platform: "xbox"},
    {_id: "125", username: "username3",platform: "ps4"},
    {_id: "126", username: "username4",platform: "pc"},
    {_id: "127", username: "username5",platform: "ps4"},
    {_id: "128", username: "username6",platform: "pc"},
      ];

let  critarray = [
   {_id: "124", username: "username2",platform: "xbox"},
   {_id: "127", username: "username5",platform: "ps4"},
   {_id: "128", username: "username6",platform: "pc"},
  ];

let critIds = new Set
critarray.forEach(item => critIds.add(item._id))

array.sort((a, b) => critIds.has(b._id) - critIds.has(a._id))
console.log(array)


推荐阅读