如何在JavaScript中按选中列表对数组排序?
解决方案
针对你的需求,核心是把选中元素移到数组最前方,剩余元素保持原有顺序,这里提供两种通用实现方式:
方式一:保持选中元素在原数组中的相对顺序
如果不需要关心selectedList的顺序,只需要把所有选中元素移到前面,这个方法最简洁:
const initArray = [ { id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }, ]; const selectedList = [ { id: 2 } ]; // 提取选中id的集合,提升查找效率 const selectedIds = new Set(selectedList.map(item => item.id)); // 拆分原数组为选中元素和未选中元素 const selectedItems = initArray.filter(item => selectedIds.has(item.id)); const unselectedItems = initArray.filter(item => !selectedIds.has(item.id)); // 合并得到结果 const output = [...selectedItems, ...unselectedItems]; console.log(output); // 输出:[{id:2}, {id:0}, {id:1}, {id:3}]
方式二:严格按照selectedList的顺序排列选中元素
如果selectedList的顺序有要求(比如选中列表是[{id:3}, {id:2}],需要先展示3再展示2),可以用映射表实现:
const initArray = [ { id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }, ]; const selectedList = [ { id: 2 } ]; // 建立id到元素的映射,快速查找 const itemMap = new Map(initArray.map(item => [item.id, item])); // 按选中列表的顺序提取元素,同时过滤原数组中不存在的元素 const selectedItems = selectedList .map(item => itemMap.get(item.id)) .filter(Boolean); // 筛选未选中的元素,保持原顺序 const unselectedItems = initArray.filter(item => !selectedItems.includes(item)); // 合并结果 const output = [...selectedItems, ...unselectedItems]; console.log(output); // 输出:[{id:2}, {id:0}, {id:1}, {id:3}]
两种方法都能满足你的需求,根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者Zuet
相关产品推荐
相关产品推荐

