如何在JavaScript/TypeScript中将对象数组指定重复元素移至首位?
如何在JavaScript/TypeScript中将数组中与指定对象重复的元素移至首位?
给定以下变量:
let Obj1 = [ {Id: 123, name: 'A'}, {Id: 124, name: 'B'}, {Id: 125, name: 'C'}, {Id: 126, name: 'D'}, {Id: 127, name: 'E'} ] let Obj2 = {Id:126, name: 'D'}
其中Obj2是后端返回的数据,Obj1是前端已有的数组,需要动态将Obj1中与Obj2重复的元素移至索引0的位置,最终期望结果如下:
[ {Id: 126, name: 'D'}, {Id: 123, name: 'A'}, {Id: 124, name: 'B'}, {Id: 125, name: 'C'}, {Id: 127, name: 'E'} ]
方法1:修改原数组操作
通过findIndex定位匹配元素的位置,删除该元素后插入到数组首位:
// 用Id作为匹配依据(对象引用不同时,直接===无法判断内容相同) const matchIndex = Obj1.findIndex(item => item.Id === Obj2.Id); if (matchIndex !== -1) { // 从原数组移除匹配元素 const matchedItem = Obj1.splice(matchIndex, 1)[0]; // 插入到数组最前面 Obj1.unshift(matchedItem); }
说明:如果后端返回的Obj2是Obj1中元素的直接引用,也可以直接用item === Obj2作为判断条件。
方法2:生成新数组(不修改原数组)
如果需要保留原数组,可以通过过滤+拼接的方式生成目标数组:
const matchedItem = Obj1.find(item => item.Id === Obj2.Id); const newArr = matchedItem ? [matchedItem, ...Obj1.filter(item => item.Id !== Obj2.Id)] : [...Obj1];
说明:先找到匹配元素,将其放在数组开头,后面拼接过滤掉该元素的原数组;如果没有找到匹配元素,则直接返回原数组的副本。
内容的提问来源于stack exchange,提问作者user14361300
相关产品推荐
相关产品推荐

