求按照某一项的index排列顺序将其进行排序
解决思路:
- 新建一个长度为原数组长度的空数组`
- 将这个空数组先填入有排序属性index的item
- 再依次填充剩下的item
关键在于对脚坐标的取值
应先取出有index的排序坐标
再过滤出不含index的排序脚坐标
再填充
- 方法实现
// 根据 attr 进行排序
export function sortByIndex(searchMeta, attr='index') {
// 新建一个空数组
const arr = new Array(searchMeta.length);
let leftKeys = [...arr.keys()];
// 有index的排序坐标
const orderIds = searchMeta
.filter((item) => item[attr])
.map((item) => item[attr]);
// 剩下的排序坐标
leftKeys = leftKeys.filter((item) => !orderIds.includes(item));
// 填充空数组
searchMeta.forEach((item, index) => {
if (item[attr]) {
// 若有排序index
arr[item[attr]] = item;
} else {
arr[leftKeys[0]] = item;
leftKeys.shift();
}
});
return arr;
}
例1
let list = [
{ index: 0, name: "aaa" },
{ index: 6, name: "bbb" },
{ index: 5, name: "ccc" },
{ index: 4, name: "ddd" },
{ index: 3, name: "eee" },
{ index: 2, name: "fff" },
{ index: 1, name: "ggg" },
];
- 执行
sortByIndex(list, "index");
即可实现 - 结果
例2
let list2 = [
{ name: "aaa" },
{ name: "bbb" },
{ name: "ccc" },
{ index: 4, name: "ddd" },
{ index: 3, name: "eee" },
{ index: 2, name: "fff" },
{ index: 1, name: "ggg" },
];
sortByIndex(list2, "index");
- 执行结果