JavaScript数组移指定元素至头部异常:结果数组长度仅为1
问题分析与解决方案
你的代码核心问题是误解了Array.splice()的返回值:
splice(index, 1)不会返回修改后的原数组,它返回的是被删除的元素组成的数组,所以你赋值的sortedAdv一开始就只有1个元素(就是你找到并删除的那个type)。- 后续调用
sortedAdv.unshift(type)只是给这个单元素数组再添加一个相同元素,最终得到的是[type, type],完全不是你想要的“将原数组指定元素移到开头”的结果。
方法一:修改原数组(直接操作原数组)
这种方式会改变原advantages数组,适合允许修改原数组的场景:
let advantages = [ 'liked', 'sendUnlimitedLikes', 'unlockSundays', 'getBoosted', 'filters', 'revealAllProfiles', 'wholeCountry', 'exlusiveBlogs' ]; console.log('advantages', advantages.length); let index = advantages.findIndex((advantage) => advantage == type); if (index > -1) { console.log('index', index); // 取出被删除的元素 const removedItem = advantages.splice(index, 1)[0]; // 将元素添加到原数组的开头 advantages.unshift(removedItem); console.log('modified advantages length', advantages.length); this.setPurchaseAdvantages(advantages); }
方法二:创建新数组(不修改原数组)
如果不想改变原数组,可以通过解构和过滤生成新数组:
let advantages = [ 'liked', 'sendUnlimitedLikes', 'unlockSundays', 'getBoosted', 'filters', 'revealAllProfiles', 'wholeCountry', 'exlusiveBlogs' ]; console.log('advantages', advantages.length); let index = advantages.findIndex((advantage) => advantage == type); if (index > -1) { console.log('index', index); // 生成新数组:目标元素放开头,其余元素排除目标元素后跟上 const sortedAdv = [ type, ...advantages.filter(item => item !== type) ]; console.log('sortedAdv length', sortedAdv.length); this.setPurchaseAdvantages(sortedAdv); }
内容的提问来源于stack exchange,提问作者gabogabans
相关产品推荐
相关产品推荐

