js set 长度_一个朋友跟我说:js 居然有 Set 结构?!

c08feeb014fafa97da24c353ecab3a79.png
不久前,一个做后端的朋友和我聊天时,对我说了一句:"我才知道原来js是有Set这种数据结构的。"

"早就出了呢。"我随口应和道,有点心虚,也就是ES6才出的,不过也好几年了,算是蛮早了吧:)

后来,我们就聊了聊这个Set,还别说,我还没有怎么用过这个东西。我就知道它可以去重

[...new Set([1,2,2,3])] // [1, 2, 3]

然后我们又聊到了:如果自己写这个去重呢?

嘿,这我还真写过:

[1,2,2,3].filter((value, index, arr) => {
	return index === arr.indexOf(value)
})
// [1, 2, 3]

这里主要利用了indexOf只会返回元素第一次出现的索引,这个很关键。

后来,我们又聊到:如果我们不去重了,就要看看这个数组里重复次数最多的是哪个元素呢?有点耿直是吧:)

嘿,这我也写过:

var arr = [1,2,3,4,3,2,2];
var arr_temp = [];

arr.map(value => {
	if(arr_temp[value] !== undefined) {
		arr_temp[value] += 1;
	} else {
		arr_temp[value] = 1;
	}
})

for(let i = 0; i < arr_temp.length; i++) {
	if(!arr_temp[i]) {
		arr_temp[i] = 0;
	}
}

console.log(arr_temp) // [0, 1, 3, 2, 1]
console.log(Math.max(...arr_temp)) // 3

这边可能有一个疑问,就是为什么最后那个不用map而用基本的for循环,这是因为map不会对undefined的元素做处理:

var newArr = []
newArr[3] = 1
newArr.map((value,index)=>{
console.log('index ===', index)
	if(newArr[index]===undefined) newArr[index] = 1;
	else newArr[index] = value
})
// index === 3

是不是感觉不错,出来了,思路也挺好的?

但是呢,这有一个问题,如果arr里面有一个极大的数,那就会浪费新数组很大的空间,比如:

arr = [1,2,2,1000,3];

那么新的数组长度就变成了1000了呢。很僵硬。

还好,有一个改进的方法:

var arr = [1,2,3,4,3,2,2];
var arr_temp = {};

arr.map(value => {
	if(arr_temp[value] !== undefined) {
		arr_temp[value] += 1;
	} else {
		arr_temp[value] = 1;
	}
})


console.log(arr_temp) // {1: 1, 2: 3, 3: 2, 4: 1}
console.log(Math.max(...Object.values(arr_temp))) // 3

利用对象实现,是不是很赞!

后来,我们又聊到了这种方式可以用在LeetCode上的一个简单的题目,叫两数求和:

给一个整数数组和一个数字,求数组中是否有两个元素之和等于该数字?

function get2num(arr, n) {
	let arr_temp = [];
	let hasNum = 0;
	arr.map(value => arr_temp[value]=1);
	arr.map((value, index) => {
		if(arr_temp[n-value] === 1 && value !== n-value){
			hasNum = 1;
			console.log('num ===', value, n-value);
		} 
	})
	if(!hasNum) {
		console.log('no such 2 num');
	}
}

get2num([1,9,6,8,4], 8) 
// no such 2 num

get2num([1,2,6,8,4], 8)
// num === 2 6 
// num === 6 2

就很好:)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值