首页 > 解决方案 > 通过另一个数组(长度更短)订购关联 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)

但它抛出了我的其他值,我想我可以循环并重建数组,但我很好奇是否有更有效的方法。

标签: javascriptarrays

解决方案


您可以使用一个对象作为排序顺序,并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);


推荐阅读