遇到的一道数组题
已知如下数组:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
思路
根据题目,分为三步:
- 扁平化
- 去重
- 排序
实现
ES5
// 拉平
function flattern(arr) {
if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
return
}
if (arr.length <= 1) {
return arr
}
var res = []
arr.forEach(element => {
if (element.length) {
res.push(...flattern(element))
} else {
res.push(element)
}
});
return res
}
// 去重
function unique(arr) {
if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
return
}
if (arr.length <= 1) {
return arr
}
var res = []
for (let index = 0; index < arr.length; index++) {
var element = arr[index];
if (res.indexOf(element) === -1) {
res.push(element)
}
}
return res
}
// 排序
// 排序算法大家都很熟悉,这里只列以下几种
// 1.冒泡排序
function bubbleSort(arr) {
if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
return
}
for (var i = 0; i < arr.length - 1; i++) {
for (var n = 0; n < arr.length - 1; n++) {
if (arr[n] > arr[n + 1]) {
var temp = 0
temp = arr[n]
arr[n] = arr[n + 1]
arr[n + 1] = temp
}
}
}
return arr
}
// 2.快速排序
function quickSort(arr) {
if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
return
}
if (arr.length > 1) {
var mid = arr[0]
var left = [],
right = []
for (var index = 1; index < arr.length; index++) {
if (arr[index] < mid) {
left.push(arr[index])
} else {
right.push(arr[index])
}
}
return quickSort(left).concat(mid, quickSort(right))
} else {
return arr
}
}
//3.选择排序
function selectionSort(arr) {
if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
return
}
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
//4.插入排序
function insertSort(arr) {
if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
return
}
for (var index = 1; index < arr.length; index++) {
var temp = arr[index]
for (var i = index - 1; i >= 0; i--) {
if (arr[i] > temp) {
arr[i + 1] = arr[i]
} else {
arr[i + 1] = temp
break
}
}
}
return arr
}
ES6
function formatByES6(arr) {
if (!Array.isArray(arr)) return
return new Array(...new Set(arr.flat(Infinity))).sort((pre, next) => {
return pre - next
})
}