数组去重-Map实现_返回结果

3248386040-5b23d269f1344_articlex.png

数组去重
去重前:[ 1, 1, 2, 2, 3, 4, 4, 5 ]
去重后:[ 1, 2, 3, 4, 5 ]
主要思路:创建一个空Map,遍历原始数组,把数组的每一个元素作为key存到Map中,因为Map中不会出现相同的key值,所以最终得到的Map中的所有key值就是去重后的结果。

function arrayNonRepeatfy(arr) {
let hashMap = new Map();
let result = new Array(); // 数组用于返回结果
for (let i = 0; i < arr.length; i++) {
if(hashMap.has(arr[i])) { // 判断 hashMap 中是否已有该 key 值
hashMap.set(arr[i], true); // 后面的true 代表该 key 值在原始数组中重复了,false反之
} else { // 如果 hashMap 中没有该 key 值,添加
hashMap.set(arr[i], false);
result.push(arr[i]);
}
}
return result;
}

let arr = [1, 1, 1, 2, 3, 3, 4, 5, 5, "a", "b", "a"];
console.log(arrayNonRepeatfy(arr)); // [ 1, 2, 3, 4, 5, 'a', 'b' ]

上面最终产生的Map不仅可以达到去重的效果,而且对每一元素的重复性都做了标注,这样想找到找到数组中重复的数就很方便了:

console.log(hashMap);

/*

0:{1 => true} {key: 1, value: true}

1:{2 => false} {key: 2, value: false}

2:{3 => true} {key: 3, value: true}

3:{4 => false} {key: 4, value: false}

4:{5 => true} {key: 5, value: true}

5:{"a" => true} {key: "a", value: true}

6:{"b" => false} {key: "b", value: false}

*/


找到数组中重复的数

[ 1, 1, 2, 2, 3, 4, 4, 5 ]

[ 1, 2, 4 ]


接上一节末尾,既然hashMap中记录了每一个元素的重复情况,找到重复的数就很简单了,遍历最终得到的hashMap,值为 true 对应的键就是重复的数:

function findRepeatNumInArray(arr) {

let hashMap = new Map();

let result = new Array();

for (let i = 0; i < arr.length; i++) {

hashMap.set(arr[i], hashMap.has(arr[i]))

}

// 得到 hashMap 后,对其进行遍历,值为 true,对应的键就是重复的数

for(let [key, value] of hashMap.entries()) {

if(value === true) {

result.push(key);

}

}

return result;

}let arr = [1, 1, 1, 2, 3, 3, 4, 5, 5, "a", "b", "a"];

console.log(findRepeatNumInArray(arr));


找到数组中第一个非重复的数

[ 1, 1, 2, 2, 3, 4, 4, 5 ]

3


代码与上一节的差不多,遍历最终得到的hashMap,第一个值为 false 对应的键就是第一个非重复数字:

function findFirstNonRepeat(arr) {

let hashMap = new Map();

for (let i = 0; i < arr.length; i++) {

hashMap.set(arr[i], hashMap.has(arr[i]))

}


// 找到第一个值为 false 的,就代表第一个非重复数,return 就好了

for(let [key, value] of hashMap.entries()) {

if(value === false) {

return key;

}

}

return "全部重复";

}let arr = [1, 1, 1, 2, 3, 3, 4, 5, 5, "a", "b", "a"];

console.log(findFirstNonRepeat(arr));


总结,三类问题的核心其实就是:利用 Map 存储每一个数字的重复情况。

方案二:

let newArr = []
arr.forEach(el=>{
const result = newArr.findIndex(ol=>{return el.id === ol.id})
if(result!== -1){
newArr[result].value = newArr[result].value + el.value
}else{
newArr.push(el)
}
})
console.log(newArr)