js 两个数组按照第二个数组的顺序排序
在JavaScript中,如果想根据一个数组的顺序来排序另一个数组,你可以使用Array.prototype.sort()
方法并结合Array.prototype.indexOf()
方法来达到这个目的。具体的例子:
方法1:使用sort()
和indexOf()
通过sort()
函数中的比较函数来比较array1
中的元素在array2
中的索引位置。如果元素在array2
中的索引较小,它将被排在前面。
let array1 = [3, 1, 2];
let array2 = [2, 3, 1];array1.sort((a, b) => array2.indexOf(a) - array2.indexOf(b));
console.log(array1); // 输出: [2, 3, 1]
方法2:创建一个映射对象
创建一个映射对象,该对象将array2
中的元素映射到其在数组中的索引位置。然后使用这个映射对象在sort()
函数中进行比较。
let array1 = [3, 1, 2];
let array2 = [2, 3, 1];let indexMap = {};
array2.forEach((item, index) => {indexMap[item] = index;
});array1.sort((a, b) => indexMap[a] - indexMap[b]);
console.log(array1); // 输出: [2, 3, 1]
注意事项:
如果array2
中的某个元素在array1
中不存在,这种方法将不会改变该元素的顺序。例如,如果array1
是[3, 4, 1]
,那么排序后的结果将是[4, 3, 1]
,其中4
不会被排序。如果希望不存在的元素排在最后,可以稍作修改:
let array1 = [3, 1, 2];
let array2 = [2, 3, 1];let indexMap = {};
array2.forEach((item, index) => {indexMap[item] = index;
});array1.sort((a, b) => {let indexA = indexMap[a] !== undefined ? indexMap[a] : Number.MAX_SAFE_INTEGER;let indexB = indexMap[b] !== undefined ? indexMap[b] : Number.MAX_SAFE_INTEGER;return indexA - indexB;
});
console.log(array1); // 输出: [4, 3, 1],其中4排在最后
扩展(数组对象)
方法1:使用一个查找表
创建一个包含所有arr2
中id
的查找表(或称映射),然后使用这个查找表来帮助排序。
let arr1 = [{ id: 3, name: "Item 3" },{ id: 1, name: "Item 1" },{ id: 2, name: "Item 2" }
];let arr2 = [{ id: 2 },{ id: 3 },{ id: 1 }
];// 创建一个查找表
let idMap = {};
arr2.forEach((item, index) => {idMap[item.id] = index;
});// 使用查找表进行排序
arr1.sort((a, b) => {let indexA = idMap[a.id];let indexB = idMap[b.id];return indexA - indexB;
});console.log(arr1);
方法2:直接使用Array.prototype.sort()
与Array.prototype.findIndex()
结合
如果不想创建额外的查找表,可以直接在排序函数中使用Array.prototype.findIndex()
来查找每个元素的索引。
let arr1 = [{ id: 3, name: "Item 3" },{ id: 1, name: "Item 1" },{ id: 2, name: "Item 2" }
];let arr2 = [{ id: 2 },{ id: 3 },{ id: 1 }
];arr1.sort((a, b) => {let indexA = arr2.findIndex(item => item.id === a.id);let indexB = arr2.findIndex(item => item.id === b.id);return indexA - indexB;
});console.log(arr1);
记录一下~