javascript普通数组去重和数组对象去重

简单的js数组去重

var test1 = [1,2,3,4,1,2,'mama'];
Array.prototype.unique1 = function()
{var temp = []; // 一个新的临时数组
        //排序sort();
        this.sort(function(a,b){
            return b-a});
        for(var i = 0; i < this.length; i++) // 遍历当前数组
        {
            //判断是否临时数组中有该遍历的元素存在
            if (temp.indexOf(this[i]) == -1) {
                temp.push(this[i]); // 若不存在,则push到临时数组里面
            }
        }
        return temp;
    }
console.log('数组排序+去重的实现'+test1.unique1());

数组对象去重

const data = [
      { atc_id: 1, atc_name: '文章1', atc_label: 'jquery' },
      { atc_id: 1, atc_name: '文章1', atc_label: 'javascript' },
      { atc_id: 2, atc_name: '文章2', atc_label: 'jquery' },
      { atc_id: 3, atc_name: '文章2', atc_label: 'javascript' },
    ];
 uniqueObj(objArray) {
    const result = [];// 去重后返回的结果数组
    const temp = {};// 临时对象
    // 将对象数组中每一项的atc_id值作为属性,若temp不拥有此属性时则为temp添加此属性且将其值赋为true,并将这一项push到结果数组中
    for (let i = 0; i < objArray.length; i++) {
      const atc_id = objArray[i].atc_id;
      if (temp[atc_id]) { // 如果temp中已经存在此属性名,则说明遇到重复项
        continue;// 不继续执行接下来的代码,跳转至循环开头
      }
      temp[atc_id] = true;// 为temp添加此属性(atc_id)且将其值赋为true
      result.push(objArray[i]); // 将这一项复制到结果数组result中去
    }
    return result;
  }
  console.log('uniqueObj(data)', uniqueObj(data));

拓展知识:
由于上面的数据是在数据库中通过多表查询出来的,所以出现了相同atc_id,不同atc_label(标签)的文章
我的目标是拿到唯一的文章和该文章对应的一个或多个标签(atc_label);像下图这样:
在这里插入图片描述

const data = [
      { atc_id: 1, atc_name: '文章1', atc_label: 'jquery' },
      { atc_id: 1, atc_name: '文章1', atc_label: 'javascript' },
      { atc_id: 2, atc_name: '文章2', atc_label: 'jquery' },
      { atc_id: 3, atc_name: '文章2', atc_label: 'javascript' },
    ];
 uniqueObj(objArray) {
    const result = [];// 去重后返回的结果数组
    const temp = {};// 临时对象
    // 将对象数组中每一项的atc_id值作为属性,若temp不拥有此属性时则为temp添加此属性且将其值赋为true,并将这一项push到结果数组中
    for (let i = 0; i < objArray.length; i++) {
      const atc_id = objArray[i].atc_id;
      if (temp[atc_id]) { // 如果temp中已经存在此属性名,则说明遇到重复项
        continue;// 不继续执行接下来的代码,跳转至循环开头
      }
      temp[atc_id] = true;// 为temp添加此属性(atc_id)且将其值赋为true
      result.push(objArray[i]); // 将这一项复制到结果数组result中去
    }
    return result;
  }
const temp = uniqueObj(data);
 temp.forEach(item1 => {
   const labelList = [];
   data.forEach(item2 => {
     if (item1.atc_id === item2.atc_id) {
       labelList.push(item2.atc_label);// lb_name
     }
     item1.labelList = labelList;
   });
 });
 console.log('temp2', temp);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值