对象键唯一: 解决一类问题

347 阅读2分钟

这是我参与更文挑战的第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这个数据结构,但是在这里要通过对象键唯一的特点引申一些东西,所以按下不表。

通过上面简单的一道程序, 就可以看出,在一些特定的场景下, 利用好对象的键唯一的这个特点,可以里较少的性能消耗,完成一些数据方面的处理。

去重:深入一点

这里,还是引入一道小伙伴发给我的题,相较基础的去重要多思考一些问题。

image.png

首先提取下关键字, 数组去重,同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)) 

看看结果

image.png

已经是能达到预期的效果了。

总结

那么是不是可以这样去思考一下, 当我们面对需要去重的问题时,首先考虑下使用对象键唯一的特点?

尽管他只是众多算法解题思路中的基础之一, 但是一些简单的数据处理,尤其是去重类的处理,都有奇效。