js数组对象去重完整工具类

本文是参考了一篇文章后进行的扩展,参考文章地址https://blog.csdn.net/yjltx1234csdn/article/details/93766707

以下代码可以直接复制,进行工具的使用(本人主学后端,所以js可能写的差,请见谅!


/**
 * 实现自定义数组对象去重
 * @param arr 去重的数组 前提保证数组中的对象包含需要的去重的标志属性
 * @param attributes 自定义的对象的属性 数组 标志属性组
 * @return newArr 根据标志属性去重的数组
 */
function customDeweighting (arr,attributes) {
    /*
    1.根据特定的属性对比,需要先获取一个新的数组
    2.利用indexof函数对字符串数组进行判断,如果不存在就加入到新的数组里面,进行返回
     */

    let newStr = [];
    let newArr =[];
    for (let i=0;i<arr.length;i++){
        let temp = {}; //还是json对象
        let obj = arr[i];
        for(let j=0;j<attributes.length;j++){
            temp[attributes[j]] = obj[attributes[j]];
        }
        let thisStr = JSON.stringify(temp);
        // 去除空格及\t空白字符
        thisStr = thisStr.replace(/(\s|[\\t])/g,'');
        if (newStr.indexOf(thisStr)===-1){
            newStr.push(thisStr);
            newArr.push(arr[i]);
        }
    }
    return newArr;

}
/**
 *add方法,保证一个数组添加以后没有重复的值,必须保证添加的目的数组是无重复的元素的
 * @param arr 无重复无元素的目的数组
 * @param item 添加的对象
 * @returns {[]}
 */
function addUnique(arr,item) {
    //将数组对象转换为数组字符串
    let newStr = arrToString(arr);
    newStr.sort();
    //先放置第一个
    let temp = itemToString(item);
    // 数组去重
    let flag = false;
    for(let i=0;i<newStr.length;i++){
        if(newStr[i]===temp){
            flag = true;
        }
    }
    if (!flag){
        arr.push(item);
    }
    return arr;
}

/**
 * 也是在一个数组里面添加一个元素,但是arr是包含有重复元素的
 * @param arr 包含有重复元素的目的数组
 * @param item 要添加的元素
 * 备注 感觉这个方法没神魔用
 */
function addUniqueArr(arr,item) {
    arr.push(item);
   return uniqueObject(arr);
}
/**
 * 数组去重主方法
 * @param arr 进行去重的数组
 * @returns {[]}
 */
function uniqueObject(arr){
    //存放的是字符串形式的数组。
    let tempArr = [];
    //将数组对象转成数组字符串。
    let newStr =arrToString(arr);
    newStr.sort();

    //先放置第一个
    let temp=newStr[0];
    tempArr.push(temp);
    // 数组去重
    for(let i=1;i<newStr.length;i++){
        if(newStr[i]!==temp){
            temp=newStr[i];  //放置到集合里面。
            tempArr.push(newStr[i]);
        }
    }
    //上面,集合还是字符串形式的数组,需要转换成json对象的形式。
    let newArr = [];
    // 新数组字符串转成数组对象
    for(let i=0;i<tempArr.length;i++){
        newArr.push(JSON.parse(tempArr[i]));
    }
    return newArr;
}

/**
 *将数组转换为 字符串数组
 * @param arr 对象数组
 * @returns {Array} 转换成字符串的数组
 */
function arrToString(arr){
    let newArr = [];
    if(arr.length !== 0){
        for(let i=0;i<arr.length;i++){ //对每一个对象数据进行处理。
            //将每一个对象里面的属性key 进行重新排序,变成新的对象。
            let thisStr = itemToString(arr[i]);
            //里面放置字符串
            newArr.push(thisStr);
        }
    }
    return newArr;
}

/**
 * 将元素转换为字符串
 * @param item
 * @returns {string}
 */
function itemToString(item) {
    //将每一个对象里面的属性key 进行重新排序,变成新的对象。
    let thisObj = sortObject(item);
    //将json对象,转换成字符串
    let thisStr = JSON.stringify(thisObj);
    // 去除空格及\t空白字符
    thisStr = thisStr.replace(/(\s|[\\t])/g,'');
    return thisStr;
}

/**
 *
 * @param obj 对象
 * @returns 将对象按照key值进行排序。
 */
function sortObject(obj){
    let keyArr = [];
    for(let item in obj){ //把所有的key放置在一个数组里面。
        keyArr.push(item);
    };
    keyArr.sort(); //排序,按照字符进行排序。
    let newObj = {}; //还是json对象
    for(let i=0;i<keyArr.length;i++){
        newObj[keyArr[i]] = obj[keyArr[i]]
    }
    //处理成 键=值的数组形式。
    //console.log("值是:"+JSON.stringify(newObj));
    return newObj;
}

以上方法亲测有效。

发布了41 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37992974/article/details/103205515
今日推荐