Skip to content

前端面试题:数组扁平化、去重、排序

题目:

已知如下数组:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

答案:

javascript
var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]
// 扁平化
let flatArr = arr.flat(4)
// 去重
let disArr = Array.from(new Set(flatArr))
// 排序
let result = disArr.sort(function (a, b) {
  return a - b
})
console.log(result)

// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

说明:

Array 属性说明: MDN Array

  • flat() 方法创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中

flat()

flat(depth) // depth 遍历深度

javascript
const arr1 = [1, 2, [3, 4]]
arr1.flat()
// [1, 2, 3, 4]

const arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat()
// [1, 2, 3, 4, [5, 6]]

const arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2)
// [1, 2, 3, 4, 5, 6]
  • Array.from() 静态方法从可迭代类数组对象创建一个新的浅拷贝的数组实例

Array.from(arrayLike)

Array.from(arrayLike, mapFn)

Array.from(arrayLike, mapFn, thisArg)

TIP

可迭代: 例如 Array、Map、Set 对象

类数组对象: 带有 length 属性或索引属性的对象

javascript
// 使用箭头函数作为映射函数去操作多个元素
Array.from([1, 2, 3], x => x + x)
// [2, 4, 6]

// 生成一个数字序列。因为数组在每个位置都使用 `undefined` 初始化,下面的 `v` 值将是 `undefined`
Array.from({ length: 5 }, (v, i) => i)
// [0, 1, 2, 3, 4]
  • sort() 方法就地对数组的元素进行排序,并返回对相同数组的引用。默认排序是将元素转换为字符串,然后按照它们的 UTF-16 码元值升序排序

sort()

sort(compareFn)

compareFn(a, b) 返回值排序顺序
> 0a 在 b 后,如 [b, a]
< 0a 在 b 前,如 [a, b]
=== 0保持 a 和 b 原来的顺序
javascript
const months = ['March', 'Jan', 'Feb', 'Dec']
months.sort() // ["Dec", "Feb", "Jan", "March"]

const numberArray = [40, 1, 5, 200]
function compareNumbers(a, b) {
  return a - b
}

numberArray.sort() // [1, 200, 40, 5]
numberArray.sort(compareNumbers) // [1, 5, 40, 200]

Released under the MIT License.