數(shù)據(jù)去重,筆試題系列

今天分享一道面試手寫(xiě)筆試題,主要考察數(shù)據(jù)去重問(wèn)題

原題是這樣的,給出一組數(shù)據(jù),去掉id相同的數(shù)據(jù)并進(jìn)行排序

const arr = [
    {id: 0,pid: 1,order: 2,},
    { id: 0,pid: 1,order: 2 },
    {id: 0, pid: 1,order: 3,},
    {id: 1,pid: 1,order: 3,},
    {id: 2,pid: 2,order: 5,},
    {id: 3,pid: 2,order: 4,}
];
過(guò)濾后的結(jié)果

[
  { id: 0, pid: 1, order: 2 },
  { id: 1, pid: 1, order: 3 },
  { id: 2, pid: 2, order: 5 },
  { id: 3, pid: 2, order: 4 }
]
方法一:主要是利用對(duì)象存儲(chǔ)id為key,對(duì)象的key不會(huì)重復(fù)

const quchong = (arr) => {
    const ret = [], obj = {};
    arr.forEach(v => {
        // if (!obj[v.id]) {
        //     ret.push(v)
        // }
        /**
         * 與下面等價(jià)
         */
        if (!Reflect.has(obj, v.id)) {
            ret.push(v)
        }
        obj[v.id] = v.id;
    })
    return ret.sort((a, b) => a.id - b.id);
}
方法二:利用reduce結(jié)合findeIndex

const quchong2 = (arr) => {
    return arr.reduce((cur, prev) => {
        if (cur.findIndex(v => v.id === prev.id) === -1) {
            cur.push(prev)
        }
        return cur.sort((a, b) => a.id - b.id);
    }, [])
}
方法三: 通過(guò)Set去重對(duì)應(yīng)的id,然后根據(jù)reduce計(jì)算方法,將原數(shù)組數(shù)據(jù)映射到對(duì)象中,然后返回對(duì)象的值

const quchong3 = (arr) => {
    const arrId = [...new Set(arr.map(v => v.id))];
    return arrId.reduce((cur, id) => {
        if (!cur[id]) {
            cur[id] = arr.find(v => v.id === id)
        }
        return Object.values(cur).sort((a, b) => a.id - b.id)
    }, {})
}
方法四: 利用Map對(duì)數(shù)據(jù)進(jìn)行過(guò)濾

const quchong4 = (arr, map = new Map()) => {
    arr.forEach(v => {
        if (!map.has(v.id)) {
            map.set(v.id, v)
        }
    });
    return Object.values(map).sort((a, b) => a.id - b.id)
}
console.log('quchong1:', quchong(arr));
console.log('quchong2:', quchong2(arr));
console.log('quchong3:', quchong3(arr));
console.log('quchong4:', quchong4(arr));
總結(jié)
主要考察數(shù)據(jù)過(guò)濾,我們利用對(duì)象key不重復(fù),先判斷對(duì)象中是否有key,向數(shù)組中添加數(shù)據(jù),然后將當(dāng)前的id作為對(duì)象的key,如果有就不向數(shù)組中添加數(shù)據(jù)

我們也可以結(jié)合reduce這個(gè)計(jì)算方法,結(jié)合findIndex判斷是否有id相同的

通過(guò)reduce與Set,Set過(guò)濾相同的id,然后進(jìn)行計(jì)算循環(huán),判斷cur中是否有pid

利用Map對(duì)原有數(shù)據(jù)進(jìn)行去重,將沒(méi)有的值,以id作為key,將當(dāng)前項(xiàng)變成值,然后調(diào)用Object.values(map)返回其值即可。

本文示例源碼code example[1]

參考資料
[1]
code example:  https://github.com/maicFir/lessonNote/blob/master/面試題/02-數(shù)據(jù)去重/index.js




作者:Maic


歡迎關(guān)注微信公眾號(hào) :web技術(shù)學(xué)苑