JavaScript - 循环遍历数组并根据对象内部的键值进行排序

3

我有一个简单的数组,通过json获取,其中每个对象都有一个名为position的键和一个特定的值。我想根据其中的键值重新排序它们(更改它们的索引)。

这是我目前拥有的: JSFiddle

代码:

var mess = [
    a = {
    lorem: "ipsum",
    position: 3
  },
  b = {
    lorem: "ipsum",
    position: 2
  },
  c = {
    lorem: "ipsum",
    position: 4
  },
  d = {
    lorem: "ipsum",
    position: 1
  }
]

var order = [];

for (i = 0; i < mess.length; i++) {
    order.splice(mess[i].position - 1, 0, mess[i]);
}

当前循环的问题在于只有第一个和最后一个对象(1,4)在 order 数组中被正确排列。


请将数据和您尝试的代码添加到问题中。请在这里查看:[mcve] - Nina Scholz
Fiddle已发布。 - g5wx
这些全局变量 a, b, c, d 有什么作用? - vp_arth
只是为了在 Fiddle 上进行快速演示。 - g5wx
3个回答

3
你可以使用Array.prototype.sort方法:

let mess = [
 {lorem: "ipsum",position: 3},
 {lorem: "ipsum",position: 2},
 {lorem: "ipsum",position: 4},
 {lorem: "ipsum",position: 1}
];

// 
console.log(mess.sort((a, b) => a.position - b.position))


1
是的,忘记排序了,谢谢! - g5wx
1
或者在您运行的环境中不支持箭头函数时,使用 mess.sort(function(a, b) { return a.position - b.position }) - Ben
@Ben,你漏写了 return 语句。 - vp_arth
@vp_arth,发帖后看到了。已经修复 :) - Ben

1
你可以使用位置作为新数组的索引。

var mess = [{ lorem: "ipsum", position: 3 }, { lorem: "ipsum", position: 2 }, { lorem: "ipsum", position: 4 }, { lorem: "ipsum", position: 1 }],
    order = [],
    i;

for (i = 0; i < mess.length; i++) {
    order[mess[i].position - 1] = mess[i];
}

console.log(order);

或者你可以从结尾逆序迭代,这对于不连续的位置也适用。

var mess = [{ lorem: "ipsum", position: 3 }, { lorem: "ipsum", position: 2 }, { lorem: "ipsum", position: 4 }, { lorem: "ipsum", position: 1 }],
    order = [],
    i = mess.length;

while (i--) {
    order.splice(mess[i].position - 1, 0, mess[i]);
}

console.log(order);


1
谢谢 Nina,很好用! - g5wx

1
尝试排序:
order = mess.sort(function (a, b) {
    return a.position - b.position;
});

谢谢Maria,我忘了排序 - 投了一票! - g5wx

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