我想知道如何重新排序一个数组,以便每个对象都在它自己的id
- 1的索引处。
//Lets say we have an array like so
var unOrderedArray=[{Id:2,Name:"Bob"}, {Id:1,Name:"Julian"},
{Id:3,Name:"Jeff"}]
我能写出什么样的功能才能得到:
var orderedArray=[{Id:1,Name:"Julian"},{Id:2,Name:"Bob"},{Id:3,Name:"Jeff"}]
到目前为止,我已尝试过此功能,但它不起作用:
for(let i = 0;i<unOrderedArray.length;i++){
correctlyOrderedArray[unOrderedArray[i].Id]=unOrderedArray[i];
}
P.S!不能保证最低Id为1,并且最低和最高Id之间没有间隙,例如2,10,5,3等。
答案 0 :(得分:6)
使用sort
method。无论你有Id
个。{/ p>
var unOrderedArray=[{Id:21,Name:"Bob"}, {Id:5,Name:"Julian"},
{Id:313,Name:"Jeff"}, {Id:4,Name:"Ivan"}];
orderedArray = unOrderedArray.sort(function(a, b) {
return a.Id - b.Id;
});
console.log(orderedArray);
答案 1 :(得分:1)
您可以使用Array#reduce创建一个包含根据其ID放置的项目的数组。但是,如果id不连续,您将获得一个稀疏数组(一个带孔的数组 - undefineds
)。
var unOrderedArray=[{Id:2,Name:"Bob"}, {Id:1,Name:"Julian"}, {Id:3,Name:"Jeff"}, {Id:10,Name:"Tom"}];
var orderedArray = unOrderedArray.reduce(function(arr, item) {
arr[item.Id - 1] = item;
return arr;
}, []);
console.log(orderedArray); // since the Tom's id is 10, you'll get 6 undefined items between Tom and Jeff
&#13;
答案 2 :(得分:0)
实际上,由于数组基于零,人们可以这样做:
const result = [];
for(var obj of unOrderedArray){
result[obj.Id] = obj;
}
结果是
[undefined, { Id:1,Name:"Bob"},...]
所以可以做到
result[1]
获取id为1的对象。
答案 3 :(得分:0)
如果你不确定这些ID是否完全顺序1-N,你可以使用它:
const sortById = arr => {
if (!arr.length) return arr;
const max = Math.max(...arr.map(obj => obj.Id));
let result = Array(max).fill(null);
arr.forEach(obj => result[obj.Id] = obj);
return result;
};