第十四天


(题目来源: 前端每日知识3+1)

Javascript题目

题目 : 写一个数组去重的方法(支持多维数组)并进行排序(js)

问题解答

  • 使用es6语法中的set方法去重, 然后使用flat方法进行降维 最后使用sort方法进行排序

解题思路

es6语法

  1. // 写一个数组去重的方法(支持多维数组)(js)
  2. function arrSet(arr) {
  3. return [...new Set(arr.flat(Infinity))].sort((a, b) => a - b) //flat方法
  4. }
  5. console.log(arrSet([1, [2, [23, 231], 31, 2],
  6. [2, 22, 3], 12, 1, 23
  7. ]));

递归+冒泡排序

  1. // 使用递归的方法写一个数组去重的方法(支持多维数组)(js)
  2. // 使用递归的方法进行降维
  3. let arr = [1, [2, [23, 231], 31, 2],
  4. [2, 22, 3], 12, 1, 23
  5. ]
  6. let newarr = []
  7. function arrSet(arr) {
  8. if (Array.isArray(arr)) {
  9. arr.forEach(item => arrSet(item));
  10. } else {
  11. newarr.push(arr)
  12. }
  13. // return [...new Set(newarr)].sort((a, b) => a - b) // 使用sort方法进行排序
  14. return setSort([...new Set(newarr)])
  15. }
  16. function setSort(nosort) {
  17. let t = 0;
  18. for (let i = 0; i < nosort.length; i++) {
  19. for (let n = 0; n < nosort.length - 1; n++) {
  20. if (nosort[n] > nosort[n + 1]) {
  21. t = nosort[n]
  22. nosort[n] = nosort[n + 1]
  23. nosort[n + 1] = t
  24. }
  25. }
  26. }
  27. return nosort
  28. }
  29. console.log(arrSet(arr));

reduce方法

  1. // 使用递归的方法写一个数组去重的方法(支持多维数组)(js)
  2. // 使用递归的方法进行降维
  3. let arr = [
  4. [1],
  5. [2, [23, 231], 31, 2],
  6. [2, 22, 3], 12, 1, 23
  7. ]
  8. const arrSet = (arr) => [
  9. ...new Set(
  10. arr.reduce(
  11. (prev, cur) =>
  12. Array.isArray(cur) ? prev.concat(arrSet(cur)) : prev.concat(cur), //concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
  13. []
  14. )
  15. )
  16. ].sort((a, b) => a - b);
  17. console.log(arrSet(arr)); //[1, 2, 3, 12, 22, 23, 31, 231]

知识扩展

  • Array.isArray() 用于确定传递的值是否是一个 Array. es5语法
  • 降维方法使用es6中的flat()方法
  1. - `flat()`用于将数组一维化, 返回一个新数组, 不影响原数组. 深拷贝
  2. - 默认一次只一维化一层数组, 若需多层, 则传入一个整数参数指定层数,比如flat(2)
  3. - 若要一维化所有层的数组, 则传入Infinity作为参数(可以传字符串也可以直接传值)
  • 数组去重则使用的是es6中的set构造函数的方法, 也可以使用find和findindex方法进行去重
  • concat() 方法用于合并两个或多个数组. 此方法不会更改现有数组, 而是返回一个新数组.
  • sort() 方法用原地算法对数组的元素进行排序, 并返回数组. 默认排序顺序是在将元素转换为字符串, 然后比较它们的UTF-16代码单元值序列时构建的MDN

sort原理

  1. if (a > b) {
  2. return 1
  3. } else if (a < b) {
  4. return -1
  5. } else {
  6. return 0
  7. }
  8. }