JavaScript如何将数组内符合条件的已有元素移至顶部且不重复
问题根源
你写的逻辑只执行了unshift()往数组头部插入符合条件的元素,没有删除元素在原位置的旧条目,必然会出现重复元素。
除此之外,在forEach遍历过程中直接通过unshift修改原数组,会动态改变数组长度和所有元素的索引位置,还会导致遍历顺序错乱,出现漏处理、重复处理元素的问题。
正确实现方案
根据你的需求选对应实现即可,两种方案都不会产生重复元素:
方案1:所有符合条件的元素全部置顶,保留组内相对顺序
不要在遍历过程中直接修改原数组,先把元素按条件拆成两组,再拼接成最终数组,逻辑最稳定:
const matched = [] const rest = [] allProducts.forEach(product => { if (checkIfProductIsMoreThen200(product.price)) { matched.push(product) } else { rest.push(product) } }) // 符合条件的元素在前,其余元素在后,无重复 allProducts = [...matched, ...rest]
方案2:仅将第一个匹配到的元素移动到顶部
先找到目标元素的索引,移除原位置元素后再插入到数组头部:
const targetIndex = allProducts.findIndex(product => checkIfProductIsMoreThen200(product.price)) // 确认找到匹配元素再操作 if (targetIndex > -1) { // 移除原位置的目标元素 const [targetProduct] = allProducts.splice(targetIndex, 1) // 插入到数组首位 allProducts.unshift(targetProduct) }
内容的提问来源于stack exchange,提问作者RoyimTas
相关产品推荐
相关产品推荐

