js数组根据对象中的某key值,组成新数组,然后去重

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

在这里插入图片描述

No.大剑师精品GIS教程推荐
0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】
1Openlayers 【入门教程】 - 【源代码+示例 300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3MapboxGL【入门教程】 - 【源代码+图文示例150+】
4Cesium 【入门教程】 - 【源代码+综合教程 200+】
5threejs【中文API】 - 【源代码+图文示例200+】
6Shader 编程 【图文示例 100+】
7Geoserver 【配置教程 100+】
8卫星应用开发教程 【配置+应用教程 100+】
9GIS数字孪生与大模型 【应用实战 100+】
10报表与数字大屏 【Echarts 实战示例】 - 【D3 综合教程】 - 【其他大屏】


项目背景:

一个数组中包括了多个对象,每个对象中又包括数组等因子,总之很复杂。 要求是将数组中的对象中的数组集中在一起,行程新的数组,然后去重。

项目效果:

在这里插入图片描述

项目代码:

let array = [{ 
        date: '2022-05-02', 
        name: 'cuclife', 
        status: 'success', 
        tag: '70', 
        band: ['R', 'B', 'PE'] 
    }, 
    { 
        date: '2022-05-04', 
        name: 'Lily', 
        status: 'fail', 
        tag: '50', 
        band: ['R', 'G'] 
    }, 
    { 
        date: '2022-05-01', 
        name: 'Kevin', 
        status: 'success', 
        tag: '20', 
        band: ['R', 'G', 'B'] 
    }, 
    { 
        date: '2022-05-02', 
        name: 'Kevin', 
        status: 'success', 
        tag: '70', 
        band: ['R', 'G', 'B', 'RE'] 
    }, 
]; 
 
//将数组对象中的某值组成新的数组 
function composeArray(array) { 
    let params = []; 
    for (let items of array) { 
        params.push(items.band); 
    } 
     
    let params1 = [] 
    for (let j = 0; j < params.length; j++) { 
        params1 = [...params1, ...params[j]] 
    } 
 
    var newArr = params1.filter(function(item, index) { 
        return params1.indexOf(item) === index;  
     }); 
    return newArr 
    console.log(newArr) 
} 
 
composeArray(array); 
<think>我们被要求提供JavaScript对象数组根据某个key的方法。根据引用内容,我们有几种不同的方法可以实现这个目标。下面我将总结并展示几种常见的方法,并解释其原理。###方法1:利用对象key的唯一性(推荐) 原理:利用JavaScript对象的键(key)不可复的特性,将数组元素中要的属性作为对象的键。如果该键已存在,则覆盖(或者跳过),最后将对象转换为数组。 ```javascriptfunction uniqueByKey(arr,key){constobj ={};arr.forEach(item =>{obj[item[key]]= item; //如果复,后面的会覆盖前面的});returnObject.values(obj);}``` 使用示例:```javascriptconstlist =[{id:1,name:'1'},{id:1,name:'1-1'}, //复id,这个会覆盖上一个{id:2,name:'2'},{id:3,name:'3'}, ];console.log(uniqueByKey(list, 'id'));//输出:[ {id:1,name:'1-1'},{id:2,name:'2'},{id:3,name:'3'} ]``` 注意:这种方法会保留最后一个出现的复项(因为后面的覆盖前面的)。如果希望保留第一个出现的,可以稍作修改: ```javascriptfunction uniqueByKeyKeepFirst(arr, key) {constobj ={};arr.forEach(item =>{//如果还没有这个key,才添加if(!obj[item[key]]) {obj[item[key]]= item;}});return Object.values(obj); }``` ###方法2:使用Array.reduce(保留第一个出现的复项) 原理:使用reduce方法遍历数组,初始设为空数组。在遍历过程中,检查当前元素的key是否已经存在于结果数组中,如果不存在则加入。 ```javascriptfunction uniqueByKeyWithReduce(arr, key) {returnarr.reduce((res, item) =>{//检查结果数组中是否已经有相同key的元素if(!res.some(sItem=> sItem[key] ===item[key])) {res.push(item);}return res;}, []); }``` 使用示例同上。注意:这种方法会保留第一个出现的复项。###方法3:使用Array.filter(保留第一个出现的复项)原理:使用filter方法,通过索引判断当前元素是否是第一次出现(即当前元素的key数组中第一次出现的索引等于当前索引)。 ```javascriptfunction uniqueByKeyWithFilter(arr,key){return arr.filter((item,index,self)=> {//当前元素在数组中第一次出现的索引等于当前索引,则保留returnself.findIndex(sItem=> sItem[key] ===item[key]) ===index;});} ```###方法4:使用Map(推荐,保留最后一个出现的复项)原理:利用Map数据结构,将key作为Map的键,整个对象作为。由于Map会保留最后一次设置的,所以最后返回Map的即可。 ```javascriptfunction uniqueByKeyWithMap(arr,key){const map= newMap();arr.forEach(item=> {map.set(item[key],item);});returnArray.from(map.values()); }``` ###总结-以上方法各有特点,主要区别在于保留第一个还是最后一个复项。-方法1(对象)和方法4(Map)性能较好,因为对象和Map的键查找是O(1)的时间复杂度。-方法2(reduce)和方法3(filter)在结果数组中查找元素,时间复杂度为O(n²),在数据量大时性能较差。###最佳实践如果对保留顺序没有特别要求,且数据量较大,推荐使用方法4(Map)或方法1(对象): ```javascript//保留最后一个复项(推荐)function uniqueByKey(arr,key){const map= newMap();arr.forEach(item=> map.set(item[key],item));returnArray.from(map.values()); }//保留第一个复项functionuniqueByKeyKeepFirst(arr, key) {constmap =new Map();arr.forEach(item =>{if (!map.has(item[key])) {map.set(item[key],item);}});returnArray.from(map.values()); }``` ###相关问题1.如何根据多个字段进行?2.在过程中如何自定义复的判断条件? 3.如何对后的数组进行排序?4.在React/Vue中如何高效地实现数组并更新视图?</think>### JavaScript 对象数组根据指定 Key 的 4 种方法 #### ✅ 方法 1:利用对象唯一性(高效推荐) ```javascript function deduplicateByKey(arr, key) { const obj = {}; arr.forEach(item => { obj[item[key]] = item; // 相同key会覆盖,保留最后出现的项 }); return Object.values(obj); } // 使用示例 const users = [ {id: 1, name: '张三'}, {id: 2, name: '李四'}, {id: 1, name: '张三新版'}, // 复id {id: 3, name: '王五'} ]; console.log(deduplicateByKey(users, 'id')); // 输出: [{id:1, name:'张三新版'}, {id:2, name:'李四'}, {id:3, name:'王五'}] ``` **特点**: - 时间复杂度 O(n),性能最佳 - 保留最后一个出现的复项 - 直接利用 JavaScript 对象唯一性[^1][^2] #### ✅ 方法 2:使用 Array.reduce()(保留首次出现) ```javascript function deduplicateByKey(arr, key) { return arr.reduce((acc, current) => { const exists = acc.some(item => item[key] === current[key]); return exists ? acc : [...acc, current]; }, []); } // 使用示例 console.log(deduplicateByKey(users, 'id')); // 输出: [{id:1, name:'张三'}, {id:2, name:'李四'}, {id:3, name:'王五'}] ``` **特点**: - 保留首次出现的复项 - 函数式编程风格 - 使用展开语法创建新数组[^3] #### ✅ 方法 3:使用 Map 对象(保留顺序) ```javascript function deduplicateByKey(arr, key) { const map = new Map(); arr.forEach(item => { map.set(item[key], item); }); return Array.from(map.values()); } // 使用示例 console.log(deduplicateByKey(users, 'id')); // 输出: [{id:1, name:'张三新版'}, {id:2, name:'李四'}, {id:3, name:'王五'}] ``` **特点**: - 保留原始顺序(最后出现的) - 更现代的 ES6 语法 - 适合需要保持插入顺序的场景 #### ✅ 方法 4:使用 filter() + findIndex()(保留首次出现) ```javascript function deduplicateByKey(arr, key) { return arr.filter( (item, index, self) => index === self.findIndex(i => i[key] === item[key]) ); } // 使用示例 console.log(deduplicateByKey(users, 'id')); // 输出: [{id:1, name:'张三'}, {id:2, name:'李四'}, {id:3, name:'王五'}] ``` **特点**: - 保留首次出现的项 - 单行函数实现 - 时间复杂度 O(n²),适合小型数组 --- ### 方法对比表 | 方法 | 时间复杂度 | 保留项 | 适用场景 | |------|------------|--------|----------| | 对象 | O(n) | 最后一项 | 大型数组,高性能需求 | | Array.reduce | O(n²) | 第一项 | 需要首次出现的小型数组 | | Map 对象 | O(n) | 最后一项 | 需要保持顺序的现代环境 | | filter+findIndex | O(n²) | 第一项 | 简单场景的小型数组 | --- ### 使用注意事项 1. **大小写敏感**:`item[key]` 比较是大小写敏感的 2. **引用类型**:当 key 对应的是对象/数组时,需先转为字符串 ```javascript // 处理对象 obj[JSON.stringify(item[key])] = item; ``` 3. **空处理**:添加空检查避免错误 ```javascript function deduplicateByKey(arr, key) { if (!arr || arr.length === 0) return []; // ...后续逻辑 } ``` --- ### 相关问题 1. 如何根据多个字段组合进行对象数组? 2. 在时如何保留特定条件的复项(如最新日期)? 3. React/Vue 中如何高效处理大型数组渲染? 4. 如何实现区分大小写的操作? 5. 对象数组时出现 `[object Object]` 冲突如何解决?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值