【问题标题】:Most efficient way to order an associative javascript array by another array (of shorter length)? [duplicate]通过另一个数组(长度更短)订购关联 javascript 数组的最有效方法? [复制]
【发布时间】:2020-03-07 03:13:59
【问题描述】:

我有一个如下所示的数组:

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)

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

【问题讨论】:

标签: javascript arrays


【解决方案1】:

您可以使用一个对象作为排序顺序并将未知的id 移动到末尾,并使用默认值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);

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2019-01-30
    相关资源
    最近更新 更多