# ❓算法手写题

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

首先充分的理解题意

  • 数组扁平化
  • 去除重复部分数据
  • 升序

就直接上代码咯

递归版本

var arrTest = [
  [1, 2, 2],
  [3, 4, 5, 5],
  [6, 7, 8, 9, [11, 12, [12, 13, [14]]]],
  10
];

const typeMap = {
  array: "Array",
  object: "Object",
  function: "Function",
  string: "String",
  null: "Null",
  undefined: "Undefined",
  boolean: "Boolean",
  number: "Number"
};

const isTypeOf = (obj, type) =>
  Object.prototype.toString.call(obj).slice(8, -1) === typeMap[type];

const checkEvery = element => {
  // 判断逻辑都可以写在这里
  if (isTypeOf(element, "array")) return true;
  return false;
};

// - 数组扁平化
function filterArray(target) {
  let result = [];
  function flatArray(tar) {
    for (let index = 0; index < tar.length; index++) {
      const element = tar[index];
      // 如果 element 还是一个数组
      if (checkEvery(element)) {
        flatArray(element);
      } else {
        result.push(element);
      }
    }
  }
  flatArray(target);
  return result;
}

console.log(filterArray(arrTest));
// - 去除重复部分数据
// 修改上面的代码
function filterArray(target) {
  // 使用 set
  let result = new Set();
  function flatArray(tar) {
    for (let index = 0; index < tar.length; index++) {
      const element = tar[index];
      // 如果 element 还是一个数组
      if (checkEvery(element)) {
        flatArray(element);
      } else {
        // 修改为set add
        result.add(element);
      }
    }
  }
  flatArray(target);
  return [...result];
}

console.log(filterArray(arrTest));

// - 升序

function filterArray(target) {
  // 使用 set
  let result = new Set();
  function flatArray(tar) {
    for (let index = 0; index < tar.length; index++) {
      const element = tar[index];
      // 如果 element 还是一个数组
      if (checkEvery(element)) {
        flatArray(element);
      } else {
        // 修改为set add
        result.add(element);
      }
    }
  }
  flatArray(target);
  // 升序
  return [...result].sort((a, b) => a - b);
}

console.log(filterArray(arrTest));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

一行代码风

// 但是在我本地 node v10.16.0 不支持 Array.flat() 方法
// 需要去浏览器中尝试
const filterArray2 = target =>
  Array.from(new Set(target.flat(Infinity))).sort((a, b) => a - b);

console.log(filterArray2(arrTest));
1
2
3
4
5
6

更多的解题思路