JavaScript基于索引删除数组元素:splice使用异常需求实现求助
问题原因
splice方法会修改原数组,返回值为被删除元素组成的数组,你直接将其放在链式调用环节,后续map遍历的是被删除的元素,而非处理后剩下的元素,导致结果错误。- 你要移除的是反转后路径数组下标为1的元素(对应
parentSlug),之前的删除位置参数设置错误。
实现方案
你可以根据需求选择以下任意一种实现:
方案1:用filter过滤(推荐,纯函数无副作用,可读性最高)
直接过滤掉反转后下标为1的元素即可:
path.split('/') .filter(i => i) .reverse() .filter((_, index) => index !== 1) .map((slug, i) => { return `${'parent->'.repeat(i)}slug.current == '${slug}'`; });
方案2:用splice修改(会修改原数组,不能直接链式调用)
splice适合需要修改原数组的场景,要注意先将反转后的数组存为变量再操作:
const reversedSlugs = path.split('/') .filter(i => i) .reverse(); // 从下标1开始,删除1个元素 reversedSlugs.splice(1, 1); const result = reversedSlugs.map((slug, i) => { return `${'parent->'.repeat(i)}slug.current == '${slug}'`; });
方案3:用slice拼接(纯函数无副作用)
slice不会修改原数组,通过截取前后两段拼接跳过要删除的元素:
const reversedSlugs = path.split('/') .filter(i => i) .reverse(); const result = reversedSlugs.slice(0,1) .concat(reversedSlugs.slice(2)) .map((slug, i) => { return `${'parent->'.repeat(i)}slug.current == '${slug}'`; });
以上实现最终得到的数组都是你预期的结果。
内容的提问来源于stack exchange,提问作者Udders
相关产品推荐
相关产品推荐

