前端常见题汇总(四)

一、数组扁平化并去重排序

例: 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})
备注
  1. 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()`方法会跳过空位。
  1. 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
})
备注
  1. 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 });
  1. some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
  • some() 方法会依次执行数组的每个元素
  • 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
  • 如果没有满足条件的元素,则返回false。
  • some() 不会对空数组进行检测。
  • some() 不会改变原始数组。
    如下图
    在这里插入图片描述
    一层一层的解析arr,直到数组无嵌套
    在这里插入图片描述
  1. new Set()可以进行数组的去重,并返回一个类似数组的对象
    在这里插入图片描述
    这时就需要Array.from() 去转换成真正的数组
    在这里插入图片描述
  2. sort() 方法用于对数组的元素进行排序,并返回数组。其中存在升降序排列
    升序排列在这里插入图片描述
    降序排序
    在这里插入图片描述
方法三
Array.from(new Set(arr.toString().split(',').map((v)=>{return parseInt(v,10)}))).sort((a,b)=>{ return a-b})
备注
  1. 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
  1. 当参数 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函数,可以接收一个函数,返回值是比较两个数的相对顺序的值

  1. 默认没有函数 是按照UTF-16排序的,对于字母数字 你可以利用ASCII进行记忆
    [3, 15, 8, 29, 102, 22].sort();
    
    // [102, 15, 22, 29, 3, 8]
    
  2. 带函数的比较
     [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,如何通过代码解决这个问题?

  1. 不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此;
  2. 在JavaScript中,所有的Number都是以64-bit的双精度浮点数存储的;
  3. 双精度的浮点数在这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));

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值