在javascript中将对象数组按顺序排列

8

我可以帮忙翻译,这是关于IT技术的内容。您需要将一组对象按顺序排列,我可以为您提供最简单的方法。例如,有一个数组:

var array = [
    {id: 1, name: "Matt"},
    {id: 2, name: "Jack"},
    {id: 3, name: "Morgan"},
    {id: 4, name: "Bruce"}
];

我已经提供了

var order = [1,4,2,3];

这指的是数组项目的对象id属性。

现在我需要重新排序数组,使其像这样:

var array = [
    {id: 1, name: "Matt"},
    {id: 4, name: "Bruce"},
    {id: 2, name: "Jack"},
    {id: 3, name: "Morgan"}
]

所以你有一个订单,需要完成,因此你想重新排序你的数组? - Tobias S
我不明白你需要做什么,你想按Id对数组对象进行排序吗? - LorenzoBerti
@Pranav C Balan解决了这个问题,并且他理解了,请检查一下。此外,@Nenad Vracar有一个很好的解决方法。我的var order保存了来自array对象的id顺序。 - Jarosław Wlazło
3个回答

13
使用 Array#sort 方法进行排序,在自定义的排序函数内使用 Array#indexOf 方法获取索引。

var array = [{
  id: 1,
  name: "Matt"
}, {
  id: 2,
  name: "Jack"
}, {
  id: 3,
  name: "Morgan"
}, {
  id: 4,
  name: "Bruce"
}];

var order = [1, 4, 2, 3];


array.sort(function(a, b) {
  // sort based on the index in order array
  return order.indexOf(a.id) - order.indexOf(b.id);
})

console.log(array);


该函数传递后应该返回什么?一个数字值?一个布尔值? - user6245072
@user6245072:一个数字,https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description - Pranav C Balan

2
你可以在 [1,4,2,3] 数组上使用 reduce() 方法,返回一个对象,其中键将是元素,值将是每个元素的索引,然后按照该对象进行排序。

var array = [
  {id: 1, name: "Matt"},
  {id: 2, name: "Jack"},
  {id: 3, name: "Morgan"},
  {id: 4, name: "Bruce"}
];

var s =  [1,4,2,3].reduce((r, e, i) => {return r[e] = i, r}, {});
var result = array.sort(function(a, b) {
  return s[a.id] - s[b.id];
});
console.log(result)


0

我猜任何涉及排序的事情都不能比O(2n)的解决方案更有效率。因此,我想用两个reduce来完成这项工作,如下所示:

var arr = [{id: 1, name: "Matt"}, {id: 2, name: "Jack"}, {id: 3, name: "Morgan"}, {id: 4, name: "Bruce"}],
  order = [1,4,2,3],
    lut = order.reduce((t,e,i) => (t[e] = i,t),{}),
 result = arr.reduce((res,obj) => (res[lut[obj.id]] = obj, res) ,[]);
 console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接