移除指定ID对象后重命名对象ID属性,如何仅用一个箭头函数实现?
问题分析与解决方案
首先,咱们得搞清楚你当前写法的问题所在:filter方法里的index是原数组的索引,不是过滤后新数组的索引。当你跳过id=5的元素时,原数组里id=6的元素原本索引是2,直接把这个值赋值给id,自然会得到{id: 2, val: "345345"},这和你想要的连续编号不符。而且filter的回调应该返回布尔值来决定是否保留元素,你原来返回element或null的写法虽然能运行,但不符合filter的设计逻辑,容易出问题。
满足需求的单一箭头函数解决方案
要在一个操作里完成“过滤指定id元素 + 重新编号剩余元素id”,用Array.reduce()是最适合的,它可以同时实现过滤和累加构建新数组的操作,完全符合你“仅用一个箭头函数”的要求:
let table = [{id:4,val:"21321"},{id:5,val:"435345"},{id:6,val:"345345"}]; const result = table.reduce((acc, element) => { if (element.id !== 5) { // 用累加器的长度作为新id,自动实现连续编号 acc.push({ id: acc.length, val: element.val }); } return acc; }, []); console.log(result); // 输出:[{id: 0,val: "21321"},{id: 1,val: "345345"}]
为什么这个方案可行?
reduce的第一个参数是回调函数,第二个参数[]是累加器acc的初始值(也就是我们最终要生成的新数组)。- 每次遍历原数组元素时,如果元素的id不是5,就把它的
val和当前累加器的长度(也就是新数组的当前元素个数,正好是下一个元素的索引)作为新的id,推入累加器。 - 整个过程只需要一次数组遍历,用一个回调函数就完成了过滤和重新编号的操作。
内容的提问来源于stack exchange,提问作者mirsahib
相关产品推荐
相关产品推荐

