列表里要取第三到第五条,写 arr.slice(2, 5) 之后对着控制台数了半天,总感觉多一条或者少一条。第二个参数是结束下标,而且不包含它,这一处最容易记错。
slice 不改原数组
const part = list.slice(2, 5);从下标 2 开始,取到下标 4,一共三个元素。开始位置大于等于结束位置,得到空数组,不报错。负数表示从末尾数,slice(-3) 是最后三个,slice(-3, -1) 是倒数第三到倒数第二,不含最后一个。
省略第二个参数就取到结尾。参数传小数会被截断取整,传字符串会先转成数字,写 '2' 也能跑,但没必要这么写。
splice 会在原数组上动刀
const removed = list.splice(2, 3);第二个参数是删除的个数,不是结束下标,用惯 slice 的人在这里常把个数当位置,一次删多了。splice 返回被删掉的那段,原数组已经变了,后面循环如果还拿 list 用,处理的就是被动过的数据。
要删一段再插入新元素,新元素接在第三个参数后面依次排开。
取末尾单个元素用 at
新一些的环境里 at 支持负下标,list.at(-1) 就是最后一个,比 list[list.length - 1] 短。它只适合取单个元素,成段还是 slice。
按条件取比算下标稳
真正想要的是待付款的那几条,用 filter 更贴切:
const picked = list.filter(item => item.status === 1);数据顺序一变,filter 的代码不用改,按下标截的就得重新数一遍。
slice 对字符串同样有效,str.slice(0, 5) 取前五个字符,边界规则和数组一致。类数组对象想转成真数组,用 Array.from 比老写法清晰。要取最后几条又不想先算长度,slice(-5) 就够,长度不足时它从头开始给,不会返回空。
判断:只读一段用 slice,删元素用 splice 并且心里清楚它在改原数组,按条件筛用 filter。三个混着用,出错的基本都是边界没数清。