原理:利用對象屬性的唯一性
1.簡單的數(shù)組去重
const arr = [1,1,1,1,1,3,3,3,3,4,5,6,7,'q','q','a','c']
const map = {} // 作為檢驗標(biāo)準(zhǔn)
const myArr = [] //去重后的新數(shù)組
for (let i = 0;i<arr.length;i++){
const ai = arr[i]
//通過map的屬性名過濾數(shù)組中的值
//如果對象map屬性(ai)不存在,說明出現(xiàn)了新的值
if(!map[ai]){
//給map對象賦值
//{ ai : i }
map[ai] = i
//把新的值賦予我的數(shù)組
myArr.push(ai)
}
}
console.log(myArr)//[1, 3, 4, 5, 6, 7, "q", "a", "c"]
2.開發(fā)中的運用:利用相同的屬性合并數(shù)據(jù)
有時候,從后端接收的數(shù)據(jù)中有重復(fù)的,此時就需要去重
比如,接收到一組json數(shù)據(jù):
[
{
Account: "11111111",
ExperimentName: "農(nóng)學(xué)實驗",
UserName: "小王",
class: "1",
major: "農(nóng)學(xué)"
},
{
Account: "11111111",
ExperimentName: "化學(xué)實驗",
UserName: "小王",
class: "1",
major: "農(nóng)學(xué)"
},
{
Account: "22222222",
ExperimentName: "農(nóng)學(xué)實驗",
UserName: "小紅",
class: "1",
major: "農(nóng)學(xué)"
},
{
Account: "22222222",
ExperimentName: "化學(xué)實驗",
UserName: "小紅",
class: "1",
major: "農(nóng)學(xué)"
},
{
Account: "33333333",
ExperimentName: "農(nóng)學(xué)實驗",
UserName: "小明",
class: "1",
major: "農(nóng)學(xué)"
},
{
Account: "33333333",
ExperimentName: "化學(xué)實驗",
UserName: "小明",
class: "163",
major: "農(nóng)學(xué)",
},
{
Account: "44444444",
ExperimentName: "農(nóng)學(xué)實驗",
UserName: "小花",
class: "1",
major: "農(nóng)學(xué)"
},
{
Account: "44444444",
ExperimentName: "化學(xué)實驗",
UserName: "小花",
class: "1",
major: "農(nóng)學(xué)",
}
]
需要我們整合相同的學(xué)生
js方法為:
let formatData = function(status){
//我們需要的數(shù)據(jù)數(shù)組
const courseData = []
//用來檢驗?zāi)骋粚傩允欠裰貜?fù)
const map = {}
//合并后的數(shù)據(jù)數(shù)組
const course = []
for (let i = 0; i < status.length; i++) {
const ai = status[i]
//當(dāng)賬號相同時我們合并數(shù)據(jù)
if (!map[ai.Account]) {
course.push({
Account: ai.Account,
//對數(shù)據(jù)進(jìn)行挑選,只選自己需要的數(shù)據(jù)
data: [{
Account : ai.Account,
UserName: ai.UserName,
class: ai.class,
major: ai.major
}]
})
map[ai.Account] = ai
}
}
//獲取我們想要的數(shù)據(jù)部分
course.forEach(item => {
courseData.push(item.data[0])
})
console.log(courseData)
}
3.使用ES6新特性
把某一屬性值相同的數(shù)據(jù)過濾,只留一條
我用Account屬性過濾
function formatData(status) {
const res = new Map();
const myData = status.filter((a) => !res.has(a.Account) && res.set(a.Account, 1))
console.log(myData)
}
Map:

image.png
注釋:
Map對象:http://www.itdecent.cn/p/204c04ba8abc
filter方法:http://www.itdecent.cn/p/efc748a1b4ce
has方法:http://www.itdecent.cn/p/3ae1aa18e8bb
set方法:http://www.itdecent.cn/p/3e8a6b38c149