一、数组扁平化并去重排序
例: var arr=[ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
方法 一
Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{ return a-b})
备注
- flat 相关知识
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]] 默认为1。
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
// 如果不管有多少层嵌套,都要转成一维数组,可以用`Infinity`关键字作为参数。
[1, 2, , 4, 5].flat()
// [1, 2, 4, 5] 如果原数组有空位,`flat()`方法会跳过空位。
- set 相关知识
[...new Set('ababbc')].join('')
// "abc" 去除字符串里面的重复字符。
const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
方法二
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
Array.from(new Set(flatten(arr))).sort((a, b) => {
return a - b
})
备注
- Array.isArray() 用于确定传递的值是否是一个 Array。
如果值是 Array,则为true; 否则为false。
// 下面的函数调用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
Array.isArray(new Array('a', 'b', 'c', 'd'))
// 鲜为人知的事实:其实 Array.prototype 也是一个数组。
Array.isArray(Array.prototype);
// 下面的函数调用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray(new Uint8Array(32))
Array.isArray({ __proto__: Array.prototype });
- some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
- some() 方法会
依次
执行数组的每个元素 - 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
- 如果没有满足条件的元素,则返回false。
- some() 不会对空数组进行检测。
- some() 不会改变原始数组。
如下图
一层一层的解析arr,直到数组无嵌套
- new Set()可以进行数组的去重,并返回一个类似数组的对象
这时就需要Array.from() 去转换成真正的数组
- sort() 方法用于对数组的元素进行排序,并返回数组。其中存在升降序排列
升序排列
降序排序
方法三
Array.from(new Set(arr.toString().split(',').map((v)=>{return parseInt(v,10)}))).sort((a,b)=>{ return a-b})
备注
- parseInt() 函数可解析一个字符串,并返回一个整数
parseInt(string, radix) 即 返回解析后的数字
。
parseInt("10"); //返回 10
parseInt("19",10); //返回 19 (10+9)
parseInt("11",2); //返回 3 (2+1)
parseInt("17",8); //返回 15 (8+7)
parseInt("1f",16); //返回 31 (16+15)
parseInt("010"); //未定:返回 10 或 8
- 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。``如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数``。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200414101429555.png)
3. 展平其他方法
```
var arr=[ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
arr.toString();
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200414102728688.png)
二、sort() 对数组进行排序
sort函数,可以接收一个函数,返回值是比较两个数的相对顺序的值
- 默认没有函数 是按照UTF-16排序的,对于字母数字 你可以利用ASCII进行记忆
[3, 15, 8, 29, 102, 22].sort(); // [102, 15, 22, 29, 3, 8]
- 带函数的比较
[3, 15, 8, 29, 102, 22].sort((a,b) => {return a - b});
三、0.1+0.2为什么等于0.30000000000000004
解释一下在js里,0.1+0.2为什么等于0.30000000000000004,如何通过代码解决这个问题?
- 不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此;
- 在JavaScript中,所有的Number都是以64-bit的双精度浮点数存储的;
- 双精度的浮点数在这64位上划分为3段,而这3段也就确定了一个浮点数的值,64bit的划分是“1-11-52”的模式,具体来说:
- 就是1位最高位(最左边那一位)表示符号位,0表示正,1表示负;
- 11位表示指数部分
- 52位表示尾数部分,也就是有效域部分
解决方案
//将浮点数转换为整数来进行计算
function getMax() {
var args = Array.prototype.slice.call(arguments, 0);
return Math.max.apply(null, args.map(item => {
var arr = item.toString().split('.');
return arr.length > 1 ? arr[1].length : 0;
}));
}
function add() {
var args = Array.prototype.slice.call(arguments, 0);
var max = getMax.apply(null, args);
return args.reduce((sum, cur) => sum + cur * max * 10, 0) / 10 * max;
}
console.log(add(0.1, 0.2));