javascript - 按另一个数组对较大的 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"},
];
此外,只要将条件数组中的所有对象都移到顶部,顺序并不重要。
任何帮助将不胜感激!
谢谢
解决方案
过滤和连接
由于您不关心这两个组以外的顺序,并且您知道较大的数组包含较小的所有元素,而不是排序,您可以只过滤掉所有critarray
项目而array
不是连接critarray
和array
:
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
是唯一标识符。
或排序
或者,如果您想对数组进行适当的排序,您也可以从中创建一个Set
idcitarray
并将其包含在该集合中作为排序的基础:
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)
推荐阅读
- javascript - 左侧赋值无效
- java - 如何在 JTextField 中放置随机数生成器
- email - 在 Cognito 中,我如何在请求更改新的错误电子邮件后回滚我的旧电子邮件
- http - HTTP 客户端在超时时返回随机错误
- python - 将列表复制到 numpy 数组中会将浮点数转换为字符串
- git - Docker 上的 Jenkins 无法连接到本地仓库
- angular - Angular Dragula DropModel 事件仅从左到右触发
- regex - 记事本正则表达式替换根据需要重复
- python - 如何在excel中将单元格按类别合并为一个
- django - 如何使用 docker 部署 django-q worker?