社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
题目:
编写一个程序, 将数组扁平化, 并去除其中重复部分数据,最终得到一个升序且不重复的数组 let arr = [[1, 2, 2], [3, 4, 5, 5],[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]
// 方式一:使用ES6提供的Array.prototype.flat处理
//扁平化后去重再排序
//arr.flat(Infinity),使用 Infinity,可展开任意深度的嵌套数组
//去重两种方式,因为new Set(arr)的结果是对象,需要转换为数组
// [...new Set(arr)]
// Array.from(new Set(arr))
function flatten1(arr) {
return Array.from(new Set(arr.flat(Infinity))).sort((a, b) => a - b)
}
console.log(flatten1(arr))
// 方式二:
//把数组直接变为字符串即可,数组toString之后,不管有多少级.最后都会变为以逗号分隔的字符串
//没有中括号和所谓的层级,相当于直接扁平化了
function flatten2(arr) {
return arr.toString().split(',').map(item => Number(item))
}
console.log(flatten2(arr))
// 也可以用join
//arr.join('|'): 1,2,2|3,4,5,5|6,7,8,9,11,12,12,13,14|10
function flatten21(arr) {
return arr.join('|').split(/(?:, | |)/g).map(item => Number(item)) //正则表达式:,或者| 即, | |,而|需要转义,也就是, | |
}
console.log(flatten21(arr))
// 方式三:
//JSON.stringify(arr):[[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10]
function flatten3(arr) {
return JSON.stringify(arr).replace(/([|])/g,'').split(',').map(item => Number(item))
}
console.log(flatten3(arr))
//方式四
// 基于数组的some方法进行判断检测,验证数组中的某一项有没有符合函数中提供的规则的
//Array.isArray([val]):检测某个值是否为数组类型(比instanceof Array准确)
function flatten4(arr) {
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr) //每次展开一层级的数组
}
return arr
}
console.log(flatten4(arr))
// 方式五: 递归
function flatten5(arr) {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten5(arr[i]))
}
else {
result.push(arr[i]) //push()
}
}
return result;
}
console.log(flatten5(arr))
上面所用到方式详解:
1.把数组直接变为字符串
toString:
join:
2.JSON.stringify:将对象a变成了字符串c,那么我就可以用JSON.parse()将字符串c还原成对象a
3.
Array.some()
var A = [1, 2, 3, 4, 5];
var B = A.some(item => {
return item > 6
})
console.log(B) //false
Array.find()
var A = [1, 2, 3, 4, 5];
var B = A.find(item => {
return item < 6
})
console.log(B) //1
结论:
find和some的区别: some返回的是boolean,find找到符合规则的,返回当前这一项,没找到符合的,返回undefined
4.使用instanceof 和 Array.isArray([val]) 判断是不是数组
function fn() {
}
let f = new fn()
f.__proto__ = Array.prototype
console.log(f instanceof Array) //true
console.log(Array.isArray(f)) //false
结论:Array.isArray([val]):检测某个值是否为数组类型(比instanceof Array准确)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!