申明一个比拟芜杂的数组:

let arr = [1, 'a', { b: 2 }, { c: 3 }, { b: 2 }, { a: 2, b: { a: 123 } }, false, null, false, undefined, null, { a: 2, b: { a: 123 } }, '1', 'a', [1, 2, 3], [6, 6, 6], [1, 2, 3], [{ a: 1 }, { b: 1 }, 1, 2, 3], [{ a: 1 }, { b: 1 }, 1, 2, 3], undefined]

这个数组中蕴含了较为丰盛的数据类型:Object、Array、Number、String、null、undefined,其中的Object还有多层嵌套

解法:

function unique (arr) {  let obj = {}  let ret = []  for (let i = 0; i <= arr.length - 1; i++) {    const cur = arr[i]    if (cur instanceof Object) {      let isEqual = ret.some(item => {        if (item instanceof Object) {          return assertObj(item, cur)        }        return false      })      if (!isEqual) {        ret.push(cur)      }      continue    }    if (!obj[typeof cur + cur]) {      obj[typeof cur + cur] = true      ret.push(cur)    }  }  return ret}function assertObj (cur, next) {  if (Object.keys(cur).length !== Object.keys(next).length) {    return false  }  for (let key in cur) {    if (cur[key] instanceof Object) {      return assertObj(cur[key], next[key])    }    if (cur[key] !== next[key]) {      return false    }  }  return true}console.log(unique(arr))