如何将数组中指定元素从原位置移动至数组开头?
解决方案
要实现将elementeSelected中的元素移到allElements数组开头,同时保留两类元素的指定顺序(选中元素按elementeSelected顺序,剩余元素按原数组顺序),可以用以下几种方法:
方法一:过滤拼接(直观简洁)
通过两次过滤分别提取选中元素和剩余元素,再合并结果:
const elementeSelected = ["a", "b"]; const allElements = ["m", "s", "e", "r", "q", "d", "a", "b", "c"]; // 按elementeSelected的顺序提取存在于allElements中的元素 const selectedItems = elementeSelected.filter(item => allElements.includes(item)); // 提取allElements中未被选中的元素,保留原顺序 const remainingItems = allElements.filter(item => !elementeSelected.includes(item)); const result = [...selectedItems, ...remainingItems]; console.log(result); // 输出: ["a", "b", "m", "s", "e", "r", "q", "d", "c"]
方法二:Set优化查找(适合大数据量)
当数组元素较多时,用Set优化查找性能,避免多次数组includes的低效遍历:
const elementeSelected = ["a", "b"]; const allElements = ["m", "s", "e", "r", "q", "d", "a", "b", "c"]; const selectedSet = new Set(elementeSelected); // 按指定顺序提取选中元素 const selectedItems = elementeSelected.filter(item => selectedSet.has(item) && allElements.includes(item)); // 提取剩余元素 const remainingItems = allElements.filter(item => !selectedSet.has(item)); const result = [...selectedItems, ...remainingItems]; console.log(result);
方法三:Reduce一次遍历(处理重复元素场景)
如果原数组存在重复元素,且需要确保选中元素仅出现一次,可通过reduce一次遍历分类,再调整顺序:
const elementeSelected = ["a", "b"]; const allElements = ["m", "s", "e", "r", "q", "d", "a", "b", "c"]; const selectedSet = new Set(elementeSelected); const { selected, remaining } = allElements.reduce((acc, item) => { if (selectedSet.has(item)) { // 避免重复添加同一元素 if (!acc.selected.includes(item)) { acc.selected.push(item); } } else { acc.remaining.push(item); } return acc; }, { selected: [], remaining: [] }); // 确保选中元素顺序与elementeSelected一致 const orderedSelected = elementeSelected.filter(item => selectedSet.has(item)); const result = [...orderedSelected, ...remaining]; console.log(result);
内容的提问来源于stack exchange,提问作者DenisPaul
相关产品推荐
相关产品推荐

