题目要求:
1.随机生成0-99长度为10的整数类型的数组,
例:[2,5,16,32,7,10,20,24,37]
2.将其排列成一个新数组,要求数组形式如下:
[ [2,5,7] [10,16] [20,24] [32,37] ]
题目思路:
1.获取随机数
2.去重处理
3.排序
4.存储 存储格式 0-9 10-19 20-29 ...
解题:
//获取随机数
//Math.random()方法就是用于生成随机数的,因为单词random的意思正是“随机的”。
该方法生成的结果是 [0, 1) 范围内的浮点数,注意这是一个左闭右开的区间,即该区间包含0而不包含1。
//例如 获取5-10之间随机数,利用math.random获取0-1之间(包含0不包含1) * 区间值 用最大值减最小值加1 得到6
//获取到0-6 0-6 + 5也就是最小区间值 获取到5-11间 math.random 获取的其实是5.几到10点几 因此我们需要向下取整
function getRandomNumber(min,max){
min = Math.floor(min);
max = Math.floor(max);//向下取整
return Math.floor(Math.random() * (max - min + 1) + min);
// 通过(Math.random() * (max - min + 1) + min)来获取我们要的随机数范围,向下取整并返回出去
}
//去重
//生成数组 初始化数组 长度为10 并return进去我们的随机数方法
let initArr = Array.from({
length: 10
}, () => {
return getRandomNumber(0, 99)
});
//去重 set方法 其他:利用for嵌套for,然后splice去重 indexof方法
//set 是 ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
//Set 本身是一个构造函数,用来生成 Set 数据结构。
initArr = [...new Set(initArr)];
//当然,也可以使用其他去重方法:
function weiyi(initArr) {
for (var i = 0; i < initArr.length; i++) {
for (var j = i + 1; j < init.length; j++) {
if (initArr[i] == initArr[j]) {
initArr.splice(j, 1);
j--;
}
}
}
return initArr;
}
//排序 题目可知,采取的是升序方式 我们使用sort方法 当a-b<0 返回负数 a在b前
initArr.sort((a,b) => a-b);
//存储
//Map结构存储数据的格式是key-value(这种结构的数据还有Property,但是不常用)。
//Key可以看成是Value 的索引,由于key是用来快速检索value的,所以key不可以重复。
//当几个key重复时,Map集合中只会留下一个key,value会取最后一个。
//首先 我们定一个空对象
const map = {}; //map是key-value类型的值,所以要用空对象
//遍历数组 得到key 然后将item/10
initArr.forEach(item =>{
const key = Math.floor(item/10);
//为什么要item除10 这与分组方式有关,例如在[ [2,5,7] [10,16] [20,24] [32,37]]中,
我们将第一组的2,5,7 分别除10,2就为0.2 5为0.5 7为0.7 然后向下取整,均为0;
所以均为0的就被放在了一组,第二组同样/10,可以看出,向下取整后,均为1,所以分到了一组,
然后我们使用此方式进行分组存储
//然后进行判断
//如果key在map里不存在,赋给他初始值也就是空数组
//如果key存在 把数据push进对应数组 代表同一类元素。
//将所有数据存储完 就得到map
if(!map[key]){
map[key] = [];
}
map[key].push(item);
});
//输出
//由于最后还是一个数组结构,所以先定义一个空数组
const result = [];
//使用for in 语句遍历map
for (const key in map){
//将值push到result
result.push(map[key]);
}
console.log(result);
结果: