haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.43k stars 3.26k forks source link

[js] 第15天 写一个数组去重的方法(支持多维数组) #48

Open haizhilin2013 opened 5 years ago

haizhilin2013 commented 5 years ago

第15天 写一个数组去重的方法(支持多维数组)

wenxd commented 2 years ago
  function removeDuplicates(arr) {
    let resArr = []
    arr.map((item) => {
      if (Array.isArray(item)) {
        resArr.push(removeDuplicates(item))
      } else {
        if (!resArr.includes(item)) {
          resArr.push(item)
        }
      }
    })
    return resArr
  }
  let res = removeDuplicates([1,1, 3, 4, 6, 6, 4, 5, 3, [2, 3, 4, 2, 3, 4, 2, 3, 4, [1,1,2,2]]])
  console.log(res)
xiaoxiaozhiya commented 2 years ago

都要用到ES6的Set对象,保存唯一的值

一维数组 var target=Array.from(new Set(arr))

多维数组 先降维度,再使用Set方法

wyy-g commented 2 years ago

function flat(arr, newArr){ arr.forEach(item => { if({}.toString.call(item) === '[object Array]'){ flat(item, newArr); }else{ if(newArr.indexOf(item) === -1){ newArr.push(item); } } }) }

function flatArr(arr){ let newArr = []; flat(arr, newArr); return newArr; }

console.log(flatArr([1,2,3,4,[1,2,3],4,[a,b,5,[4,5,6],[1,2]]]))

Rednaxela-LinYi commented 1 year ago

。。。人家让你们去重,谁让你们降维了,题目要求难道不是返回一个和原数组结构相同的,去重后的数组吗? function deSameElement(arr, resMap = {}) { return arr.reduce((acc, cur) => { let res = null; if (Array.isArray(cur)) { res = deSameElement(cur, resMap); if (Array.isArray(res) && res.length > 0) { acc.push(res); } } else { if (!resMap[cur]) { res = cur; resMap[cur] = true; acc.push(res); } } return acc; }, []); }

let testArr = [ [1, 2, 3, 4, 5, 6], [2, 5, 7, 9, 4, 3], 10, 5, 8, [2, 3, 3], 4, 3, 9, ];

console.log(deSameElement(testArr)); // [ [ 1, 2, 3, 4, 5, 6 ], [ 7, 9 ], 10, 8 ]

pengsir120 commented 1 month ago

function arrayFlat(arr) { return Array.from(new Set(arr.flat(Infinity))) }