【问题标题】:Sort array of objects by array of IDs [duplicate]按ID数组对对象数组进行排序[重复]
【发布时间】:2017-04-27 03:16:03
【问题描述】:

是否可以很容易地通过 ID 数组对对象数组进行排序?这是一个例子:

[{
    id: "A",
    name: "John"
}, {
    id: "B",
    name: "Bobby"
}, {
    id: "C",
    name: "Peter"
}]

现在我有一个对象数组,每个对象都有一个唯一的 ID。然后我有一个像这样的 ID 数组:

var ids = ["C", "A", "B"];

是否可以对对象数组进行排序,所以它最终是这样的:

[{
    id: "C",
    name: "Peter"
}, {
    id: "A",
    name: "John"
}, {
    id: "B",
    name: "Bobby"
}]

【问题讨论】:

标签: javascript arrays sorting ecmascript-5


【解决方案1】:

你可以用一个对象来排序。

var data = [{ id: "A", name: "John" }, { id: "B", name: "Bobby" }, { id: "C", name: "Peter" }],
    ids = ["C", "A", "B"],
    order = {};

ids.forEach(function (a, i) { order[a] = i; });

data.sort(function (a, b) {
    return order[a.id] - order[b.id];
});

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果您在 ids 数组中只有相同数量的 id,那么您可以使用分配的索引重新排列数组而不进行排序。

var data = [{ id: "A", name: "John" }, { id: "B", name: "Bobby" }, { id: "C", name: "Peter" }],
    ids = ["C", "A", "B"],
    result = [];

data.forEach(function (a) {
    result[ids.indexOf(a.id)] = a;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 第二种解决方案需要 n^2,因此可能效果不佳
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2020-10-11
  • 2015-02-25
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多