ES6數組內對象去重


這個數組去重轉自https://www.cnblogs.com/caideyipi/p/7679681.html,
就當筆記記錄:

去重Set

  const arr = ['張三','張三','三張三']
 let set = new Set(arr); // set 自帶去重
 // Set { '張三', '三張三' }
 console.log(set);
 console.error(Array.from(set)); // [ '張三', '三張三' ]

直接在控制台粘貼打印:

  let person = [
     {id: 0, name: "小明"},
     {id: 1, name: "小張"},
     {id: 2, name: "小李"},
     {id: 3, name: "小孫"},
     {id: 1, name: "小周"},
     {id: 2, name: "小陳"},   
];

let obj = {};

let peon = person.reduce((cur,next) => {
    obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
    return cur;
},[]) //設置cur默認類型為數組,並且初始值為空的數組
console.log(peon);
// (4) [{…}, {…}, {…}, {…}]0: {id: 0, name: "小明"}1: {id: 1, name: "小張"}2: {id: 2, name: "小李"}3: {id: 3, name: "小孫"}length: 4__proto__: Array(0)

去重reduce:

let hash = {};
let config = [{
    name: 2,
    state: true,
    output: 'Y',
}, {
    name: 3,
    state: true,
    output: 'A',
}, {
    name: 5,
    state: true,
    output: 'S',
}, {
    name: 7,
    state: true,
    output: 'B',
}];

config = [...config, {
    name: 3,
    state: false,
    output: 'A',
}]
const newArr = config.reduceRight((item, next) => {
    hash[next.name] ? '' : hash[next.name] = true && item.push(next);
    return item
}, []);
console.log(JSON.stringify(newArr));

// [{"name":3,"state":false,"output":"A"},{"name":7,"state":true,"output":"B"},{"name":5,"state":true,"output":"S"},{"name":2,"state":true,"output":"Y"}]

附源碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>對象數組去重</title>
    <script src="./jquery-3.3.1.min.js"></script>
</head>
<body>
    <script type="text/javascript">
        //(1)對象數組去重:reduce()方法
        let log = console.log.bind(console);
        let person = [
            {id: 0, name: "小明"},
            {id: 1, name: "小張"},
            {id: 2, name: "小李"},
            {id: 3, name: "小孫"},
            {id: 1, name: "小周"},
            {id: 2, name: "小陳"},   
        ];
        let obj = {};
        //對象集合去重:ES5:reduce()
        person = person.reduce((cur,next) => {
            obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
            return cur;
        },[{id: 4, name: "jack"},{id: 0, name: "小江"}]) //設置cur默認類型為數組,並且初始值為空的數組
        console.log(person);
       //(2)對象數組去重:filter()方法
       var arr = [{
                id: 1,
                name: 'Zane'
                },{
                id: 1,
                name: 'Zane'
                },{
                id: 2,
                name: 'Zouli'
                }]
        var result =[];
        result = uniqueFun(arr,"id");
        console.log(result);
        //(3)基本類型數組去重方式(ES6語法)
        const arr1 =[1,1,12,2,3];        
        let resultArr = Array.from(new Set(arr1))
        console.log(resultArr);
       //對象集合去重
    //    person = arrayToDistinct(person,'id');
    //    log(person);
    //    let arrays={};
    //    arrays = arrayToDistinct(person,'id');
    //    log(arrays);

/**
 * 對象數組去重,type表示對象里面的一個屬性
*/
function  uniqueFun(arr,type)
{
   const res = new Map();
   return arr.filter((a)=>!res.has(a[type])&& res.set(a[type],1));
}   


/**
 * 對象數組去重
 * @param {any} array:數組
 * @param {any} field:去重字段
 */
function arrayToDistinct(array,field) {
    let obj ={};
    array = array.reduce((cur, next) => {
        obj[next.id] ? "" : obj[next.id] = true && array.push(next);
        return cur;
    },[]);//設置cur默認類型為數組,並且初始值為空的數組
    return array;
}
    </script>
</body>
</html>

補充:這個博客記錄的參數說明比較詳細:https://www.cnblogs.com/caideyipi/p/7679681.html,下面是具體內容供參考:
假設有這樣一個數組:

let person = [
     {id: 0, name: "小明"},
     {id: 1, name: "小張"},
     {id: 2, name: "小李"},
     {id: 3, name: "小孫"},
     {id: 1, name: "小周"},
     {id: 2, name: "小陳"},   
]

我們想去掉數組中id重復的對象,比如同樣id為2的兩個對象——

{id: 2, name: "小李"}和{id: 2, name: "小陳"} (去掉任何一個都可以)
我們該如何去做呢?

事實上,對於數組對象,傳統的去重方法無能為力,至於forEach()、filter()等迭代方法也不好使;真正能做到優雅去重的,是ES5新增加的一個方法——reduce()

reduce()方法接收一個回調函數作為第一個參數,回調函數又接受四個參數,分別是:

*1.previousValue => 初始值或上一次回調函數疊加的值;

*2. currentValue => 本次回調(循環)將要執行的值;

*3. index =>“currentValue”的索引值;

*4. arr => 數組本身;

reduce()方法返回的是最后一次調用回調函數的返回值;

let log = console.log.bind(console);
let arr = [1,2,3,4,5,6];
arr = arr.reduce((previousValue, currentValue) => {
     return previousValue + currentValue; //返回的是最后一次調用回調函數的值,15+6;
})
log(arr); // 21

可以看出,上面代碼的最終結果就是1+2+3+4+5+6 = 21;

此外,reduce還可以接收第二參數initialValue,用來聲明回調函數(第一個參數)的previousValue的類型和初始值;

let log = console.log.bind(console);
let arr = [1,2,3,4,5,6];
arr = arr.reduce((previousValue,currentValue) => {
     return previousValue + currentValue;
},0) //指定cur的類型為Number並且初始值為0,當設為1時,最終打印的值為22
log(arr); // 21

需要注意的是,如果設置了initialValue的值,第一次執行回調函數的previousValue的值等於initialValue,此時查看當前索引(index)為0;但如果不設置initialValue的值,previousValue的值為數組的第一項,並且索引值(index)為1;也就是說,不設置初始值的話reduce()方法實際是從第二次循環開始的!

現在讓我們回到文章開頭的那個數組:

let log = console.log.bind(console);
let person = [
     {id: 0, name: "小明"},
     {id: 1, name: "小張"},
     {id: 2, name: "小李"},
     {id: 3, name: "小孫"},
     {id: 1, name: "小周"},
     {id: 2, name: "小陳"},   
];

let obj = {};

person = person.reduce((cur,next) => {
    obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
    return cur;
},[]) //設置cur默認類型為數組,並且初始值為空的數組
log(person);

打印person后,我們就可以得到去重后的數組。

當然, redecu()除了累加和去重外,功能還有很多,比如可以扁平化多維數組——

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
    return a.concat(b);
}, []); // [0,1,2,3,4,5]

再說句題外的,提到去重,很多人都會想到ES6的Set;不過根據我的實驗,Set還是適合對基本類型的去重,如果Set中的每一項是對象的話,是不會去重的,j即使有的對象一模一樣——

let arr = new Set([
    {id: 0, name: "小明"},
    {id: 0, name: "小明"},
    {id: 0, name: "小明"},
    {id: 0, name: "小明"}      
]);
console.log([...arr]); //依舊是這4個對象
補充:js 刪除兩個數組中id相同的對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM