javascript - 通过另一个数组(长度更短)订购关联 javascript 数组的最有效方法?
问题描述
我有一个看起来像这样的数组:
cPrefs = [0:{ id: 5, name: "Sixth thing" },
1:{ id: 3, name: "Fourth thing" },
2:{ id: 4, name: "Fifth thing" },
3:{ id: 0, name: "First thing" },
4:{ id: 2, name: "Third thing" },
5:{ id: 1, name: "Second thing" }]
我还有另一个排序数组,如下所示:
cOrder = ["1", "3", "2", "5"]
我需要按第二个数组(具有 id)对第一个数组进行排序,并将未识别的对象留在最后(以任何顺序)。所以正确的最终排序可能如下所示:
[0:{ id: 1, name: "Second thing" },
1:{ id: 3, name: "Fourth thing" },
2:{ id: 2, name: "Third thing" },
3:{ id: 5, name: "Sixth thing" },
4:{ id: 0, name: "First thing" },
5:{ id: 4, name: "Fifth thing" }]
我不确定实现这一目标的最佳方法。我努力了
const output = cOrder.map(i => cPrefs[i].id)
但它抛出了我的其他值,我想我可以循环并重建数组,但我很好奇是否有更有效的方法。
解决方案
您可以使用一个对象作为排序顺序,并id
使用默认值将 unknown 移动到末尾Infinity
。
var cPrefs = [{ id: 5, name: "Sixth thing" }, { id: 3, name: "Fourth thing" }, { id: 4, name: "Fifth thing" }, { id: 0, name: "First thing" }, { id: 2, name: "Third thing" }, { id: 1, name: "Second thing" }],
cOrder = [1, 3, 2, 5],
order = cOrder.reduce((r, k, i) => (r[k] = i + 1, r), {});
cPrefs.sort((a, b) => (order[a.id] || Infinity) - (order[b.id] || Infinity));
console.log(cPrefs);
推荐阅读
- java - 在 Raspberry pi 3B+ 上创建 ActiveMQ Artemis 代理实例时出现问题
- input - Ethash 的输入
- mysql - 使用大于索引 ID 添加附加索引以选择查询和获取结果
- html - 在 html 页面中嵌入 matplotlib 条形图
- python - django-allauth python:3.8.3-alpine Dockerfile 的依赖项是什么
- android - flutter video_player 在发布模式下不播放视频
- python - 只抓取包含某些单词的段落
- oracle - 如何在 PL/SQL 中只显示 5 行
- python - 我的 Python RTD 服务器不工作,因为线程没有被重新初始化?
- java - Eclipse 插件试图从已删除的插件项目中加载图标