这是我参与更文挑战的第11天,活动详情查看: 更文挑战
前言
这是一篇心得类的文章,来源自对一些基础算法题的思路解析,运用的一个基本思想,或者说是基本逻辑。
利用对象的键唯一的特性,可以实现一类算法题的解题。
数组去重
利用对象键唯一的特性,完成数组去重的操作算是基操了。
function fn(data){
let result = [], map = {};
data.map(item => {
if(!map[item]){
result.push(item);
map[item] = true;
}
})
return result;
}
let newData = fn([1,2,1,1]); // newData = [1,2]
尽管在ES6中已经有了Set这个数据结构,但是在这里要通过对象键唯一的特点引申一些东西,所以按下不表。
通过上面简单的一道程序, 就可以看出,在一些特定的场景下, 利用好对象的键唯一的这个特点,可以里较少的性能消耗,完成一些数据方面的处理。
去重:深入一点
这里,还是引入一道小伙伴发给我的题,相较基础的去重要多思考一些问题。
首先提取下关键字, 数组去重,同id保留w最大, 位置不变。
好吧,提取之后还是原文, 但是如果是长文描述的话, 利用提取关键字的做法也能迅速厘清需要做的操作。
解法
1、关于去重这一步,就可以利用上面提到的对象中键唯一的特点来完成。
2、同id对象,保留w最大的, 并且先后顺序一致。
3、这时就不能单纯的只判断是否存在于对象中了,还要看看如果存在的话,谁的w值更大。
那么对象就要换一个方式来去存储数据了, map = {id: w}, 如: map={1: 2}
另外,关于位置顺序不变, 就得在更新数据的时候,移除就数据,重新push了
function noRepeat(data){
let result = [], map = {};
data.map(item => {
if(map[item.id] && map[item.id] < item.w){
for(let i = 0; i < result.length; i++){
if(item.id == result[i].id){
result.splice(i,1);
result.push(item)
}
}
} else if(!map[item.id]){
result.push(item);
map[item.id] = item.w
}
})
return result;
}
let data = [{id:1,w:1},{id:2,w:2},{id:1, w:2},{id:2, w:1}];
console.log( noRepeat(data))
看看结果
已经是能达到预期的效果了。
总结
那么是不是可以这样去思考一下, 当我们面对需要去重的问题时,首先考虑下使用对象键唯一的特点?
尽管他只是众多算法解题思路中的基础之一, 但是一些简单的数据处理,尤其是去重类的处理,都有奇效。