题目要求:

let arr = [ 1, 2, 3, [ 4, 5, 3 ], [ 4, 3, 2, [ 5, 4, 3 ] ] ] 将这个数组:扁平化,去重,排序(升序)

步骤:

1. 扁平化处理

(1)递归遍历

  1. Array.prototype._flat_1 = function(){
  2. const result = this.map(item =>{
  3. if(Array.isArray(item)){
  4. return item._flat_1()
  5. }
  6. return [item]
  7. })
  8. return [].concat(...result)
  9. }

(2)reduce函数迭代

  1. Array.prototype._flat_2 = function(){
  2. return this.reduce(function(pre,next){
  3. return pre.concat(Array.isArray(next) ? next._flat_2() : next)
  4. },[])
  5. }

(3)some函数实现

  1. Array.prototype._flat_3 = function(){
  2. let result = this
  3. while(result.some(item=>Array.isArray(item))){
  4. result = [].concat(...result)
  5. }
  6. return result
  7. }

(4)for…of循环实现

  1. Array.prototype._flat_4 = function(){
  2. let result = []
  3. for (const item of this) {
  4. if(Array.isArray(item)){
  5. result = result.concat(...item)
  6. }else{
  7. result.push(item)
  8. }
  9. }
  10. return result
  11. }

2.去重

(1)使用set集合(ES6)

  1. Array.prototype.getUnique_1 = function(){
  2. // return [...new Set(this)]
  3. return Array.from(new Set(this))
  4. }

(2)使用map从原型上遍历(ES5)

  1. Array.prototype.getUnique_2 = function(){
  2. let map = {};
  3. let res = [];
  4. for (const item of this) {
  5. if(!map.hasOwnProperty(item)){
  6. map[item] = 1;
  7. res.push(item)
  8. }
  9. }
  10. return res
  11. }

3.排序

(1)直接使用sort

  1. const sortTag = (a, b) => a - b;
  2. // 最终结果
  3. console.log(arr._flat_4().getUnique_2().sort(sortTag));