第 11 题:将数组扁平化并去除其中重复数据,最终得到一个升序且不重复的数组

发布于 2022-05-29 09:42:42 字数 102 浏览 863 评论 48

Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{ return a-b})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(48

你另情深 2022-05-04 13:57:46

01
[...new Set(arr.toString().split(','))].sort((a,b)=>a-b)

笛声青案梦长安 2022-05-04 13:57:46

额 虽然没大佬们厉害,暂且做个记录吧

function flap(arr){
  if([].every.call(arr,item=>!Array.isArray(item))){
    return arr; 
  }
  return [].reduce.call(arr,(pre,cur)=>{
    if(Array.isArray(cur)){
      return [].concat(pre,flap(cur));
    }else{
      return [].concat(pre,cur);
    }
  },[])
}

function removeRepeat(arr){
  return [...new Set(arr)];
}

function sort(arr){
  return [].sort.call(arr,(a,b)=>a-b)
}

function handle(data,...fns){
  return fns.reduce((pre,cur)=>{
      return cur(pre);
  },data)
}

handle(arr,flap,sort,removeRepeat);
沙与沫 2022-05-04 13:57:46

arr.join(','),split(','),sort((a,b) => a - b)

小瓶盖 2022-05-04 13:57:46

拍平: const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
用toString会改变数组里面的原始数据,应该会是扣分项。

风蛊 2022-05-04 13:57:46
Array.from(new Set(arr.toString().split(',').map(Number))).sort((a, b) => (a-b))
少跟Wǒ拽 2022-05-04 13:57:46
  1. 拍平数组:const flatArray = arr => arr.reduce((a,b) => a.concat(Array.isArray(b) ? flatArray(b): b), []);
  2. 去重+排序: [...new Set(flatArray)].sort((a,b) => a-b);
美男兮 2022-05-04 13:57:46

var arr = [...new Set(arr.join(',').split(','))].map(v => Number(v)).sort((a,b) => a-b)

夏末的微笑 2022-05-04 13:57:46

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

  var obj = {};
  function arrDef(arr) {
      if(arr instanceof Array){
        arrforDef(arr)
      }else {
        obj[arr] = 1;
      }
  }

  function arrforDef(arr){
    arr.forEach( function(element, index) {
       arrDef(element)
    });
  }

 
  arrDef(arr);
  console.log(Object.keys(obj))
九歌凝 2022-05-04 13:57:46

var arr = [...new Set(arr.toString().split(',').map(Number).sort((a,b)=>a-b))]

最偏执的依靠 2022-05-04 13:57:46
const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]

function flat (arr) {
  function toFlat (acc, current) {
    if (Object.prototype.toString.call(current) === '[object Array]') {
      current.forEach(item => {
        toFlat(acc, item)
      })
    } else {
      if (!acc.includes(current)) {
        acc.push(current)
      }
    }
    return acc
  }
  return arr.reduce(toFlat, []).sort((value1, value2) => value1 - value2)
}

flat(arr)

利用Array.prototype.reduce函数递归进行函数拍平去重加排序。这个咋样?

春夜浅 2022-05-04 13:57:46

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

    // // 去扁平化
    function paiping(arr){
        if(Array.isArray(arr)){
            let arr_ = [];
            digui(arr,arr_);
            return arr_;
        }
    }
    // 递归
    function digui(arr_item,arr_){
        for(let i=0;i<arr_item.length;i++){
                if(Array.isArray(arr_item[i])){
                    digui(arr_item[i],arr_);
                }else{
                    arr_.push(arr_item[i]);
                }
            }
    }
    let res =[...new Set(paiping(arr).sort((a,b)=>a-b))];
    console.log(res);
    // 方法二
   let res2 =[...new Set(arr.toString().split(",").map((items)=>{
      return parseInt(items);
   }).sort((a,b)=>a-b))] ;
   console.log(res2);
年华零落成诗 2022-05-04 13:57:46

原题中的Infinity是用来干什么的

眉目亦如画i 2022-05-04 13:57:46
function flatAndSort (arr, map = {} ) {
    return arr.reduce((ret, curr) => {
        if (Array.isArray(curr)) {
            ret = ret.concat(flatAndSort(curr, map))
        } else {
            if (!map[curr]) {
                ret.push(curr)
                map[curr] = true
            }
        }
        return ret
    }, []).sort((a, b) => a - b)
}
遇到 2022-05-04 13:57:46
function flatArray(array: any[]): number[] {
  return [...new Set(array.flat(Infinity))].sort((a, b) => a - b);
}
console.log(flatArray([ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]));
姜生凉生 2022-05-04 13:57:46

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
console.log(Array.from(new Set(arr.toString().split(','))).sort((a,b)=>{return a- b }) );

一世旳自豪 2022-05-04 13:57:46

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
let newArr = [...new Set(arr.flat(Infinity))].sort((a, b) => {return a-b})

许一世地老天荒 2022-05-04 13:57:46
var arr =  [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
var a = [];
      function flat(arr){
        while(arr.length){
          var item = arr.pop();
          if(typeof(item) == 'number'){
            a.indexOf(item) < 0 && a.push(item)
          }else{
            flat(item);
          }
        }
        return a.sort((a,b) => a-b)
      };
console.log(flat(arr))
风尘浪孓 2022-05-04 13:57:46

写一个不用flat函数的吧。采用递归解决这个问题
const flat = (arr: (number | any[])[]): number[] => {
return _flat(arr, 0, arr.length - 1)
}

const _flat = (arr: (number | any[])[], l: number, r: number): number[] => {
if (l > r) return []
const first = arr[l]
if (typeof first === 'number') {
return [...new Set(_flat(arr, l + 1, r).concat(first))].sort((a, b) => a - b)
}
return [...new Set([..._flat(first, 0, first.length - 1), ..._flat(arr, l + 1, r)])].sort((a, b) => a - b)
}

漆黑的白昼 2022-05-04 13:57:46

[...new Set(JSON.parse('['+arr+']'))].sort((a,b)=> a-b)

离去的眼神 2022-05-04 13:57:46

function fn(arr) { return [...new Set(arr.reduce((prev, curr) => prev.concat(Array.isArray(curr) ? fn(curr) : curr), []))].sort((a, b) => a - b) }

是你 2022-05-04 13:57:46

[...new Set(arr.flat(Infinity))].sort((a,b)=>a-b)

最单纯的乌龟 2022-05-04 13:57:46

const res = [...new Set(arr.toString().split(',').map(item => +item))].sort((a, b) => a-b);

落在眉间の轻吻 2022-05-04 13:57:46

[...new Set(arr.toString().split(','))].sort((a,b)=>a-b)

比忠 2022-05-04 13:57:46
var arr = [ [1, 2, 2], [3, 4, 5, [5]], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
function flatArray(arr) {
	const res = []
	if(Array.isArray(arr)) {
		arr.forEach((item) => {
			if(Array.isArray(item)) {
				res.push(...flatArray(item))
			} else {
				res.indexOf(item) > -1 ? '' : res.push(item)
			}
		})
	}
	return [...new Set(res)].sort((a, b) => a - b)
}
function flatArrayBuiltIn(arr) {
	return Array.from(new Set(arr.flat(Infinity))).sort((a, b) => a- b)
}
江湖彼岸 2022-05-04 13:57:46

看了好多都是es6语法知识,或者toString转字符串,切割数组......

半衬遮猫 2022-05-04 13:57:46

var Arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
var newArr = new Set(Arr.flat(Infinity))
function mySort(a,b){
return a - b
}
console.log([...newArr].sort(mySort))

站稳脚跟 2022-05-04 13:57:46
arr.toString().split(",").sort((a,b)=>{ return a-b})

2个问题:1、字符串数组;2、没去重。修正:Array.from(new Set(arr.toString().split(",").map(Number))).sort((a,b)=>{ return a-b})

怼怹恏 2022-05-04 13:57:46

var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
const arr1 = arr.flat(4);
const arr2 = [];
for (let i = 0; i < arr1.length; i++) {
if (arr2.indexOf(arr1[i]) === -1) {
arr2.push(arr1[i]);
}
}
arr2.sort((a, b) => {
return a - b;
});
console.log(arr2);

铁轨上的流浪者 2022-05-04 13:57:46

我觉得这种方式更好吧,通俗易懂

风和你 2022-05-04 13:57:46

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

function flat(arr) {
return [...new Set(arr.flat(Infinity))].sort((a, b) => a - b)
}
console.log(flat(arr))

删除会话 2022-05-04 13:57:46
function flat(arr, map = {}) {
    const res = []
    for (let i = 0, l = arr.length; i < l ; i++) {
        const tmp = arr[i]
        if (Array.isArray(tmp)) {
            res.push(...flat(tmp, map))
        } else {
            if (!map[tmp]) {
                map[tmp] = true
                res.push(tmp)
            }
        }
    }
    return res
}
守望孤独 2022-05-04 13:57:17

[...new Set(String(arr).split(','))].sort((a, b) => a - b).map(Number)

長街聽風 2022-05-04 13:57:07

看一道面试题:

已知如下数组:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

答案:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
// 扁平化
let flatArr = arr.flat(4)
// 去重
let disArr = Array.from(new Set(flatArr))
// 排序
let result = disArr.sort(function(a, b) {
    return a-b
})
console.log(result)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

关于 Set 请查阅 Set、WeakSet、Map及WeakMap

本文首发于我的博客:数组扁平化、去重、排序

杀手六號 2022-05-04 13:56:48

利用前面的答案,修正一个没用ES6的写法:

// 1、扁平化数组
var flatArr = arr.toString().split(",");
// 2、去重
var hash = {};
for (var i = 0, len = flatArr.length; i < len; i++) {
hash[flatArr[i]] = "abc"
}
flatArr = [];
// 3、将元素字符串转化为数字、遍历hash并不能保证输出顺序
for (var i in hash) {
flatArr.push(+i)
}
// 4、排序
flatArr = flatArr.sort(function(a, b) {
return a - b
})
console.log(flatArr)

以酷 2022-05-04 13:56:28

递归函数解法:

function spreadArr(arr=[]){
	if(arr.some(ele=>Array.isArray(ele))){
		let newArr = [];
		arr.forEach((ele) => {
			if(Array.isArray(ele)){
				newArr = newArr.concat(...ele)
			}else{
				if(!newArr.includes(ele)) newArr.push(ele)
			}
		})
		return spreadArr(newArr);
	}
	return arr.sort((a,b)=> a-b);
}
spreadArr([ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]);
半岛未凉° 2022-05-04 13:56:21
var old_arr=[ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
		
// 数组拍平
var level_arr=old_arr.flat(4);

//数组去重
var Distinct=Array.from(new Set(level_arr));

// 排序
var sort=  Distinct.sort((a, b) =>a - b)

console.log("new arr",sort)
一世旳自豪 2022-05-04 13:56:04
Array.prototype.falt = function() {
    return [].concat(...this.map(item => (Array.isArray(item) ? item.falt() : [item])));
}

Array.prototype.unique = function() {
    return [...new Set(this)]
}

const sort = (a, b) => a - b;

console.log(arr.falt().unique().sort(sort)); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]

函数名应该是flat

  • -感谢斧正
如果没结果 2022-05-04 13:52:29
Array.prototype.falt = function() {
    return [].concat(...this.map(item => (Array.isArray(item) ? item.falt() : [item])));
}

Array.prototype.unique = function() {
    return [...new Set(this)]
}

const sort = (a, b) => a - b;

console.log(arr.falt().unique().sort(sort)); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]

函数名应该是flat

陈年往事 2022-05-04 13:51:06
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
function flatten(arr) {

    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    }

    return arr;
}
Array.from(new Set(flatten(arr))).sort((a, b) => {
 return a - b
})
墨小墨 2022-05-04 13:21:51
Array.prototype.flat= function() {
    return [].concat(...this.map(item => (Array.isArray(item) ? item.flat() : [item])));
}

Array.prototype.unique = function() {
    return [...new Set(this)]
}

const sort = (a, b) => a - b;

console.log(arr.flat().unique().sort(sort)); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]
各空 2022-05-04 10:54:38

arr.toString()。split(“,”)。sort((a,b)=> {return ab})

你可能后面需要 arr.toString().split(",").sort((a,b)=>{ return a-b}).map(Number)
不然数组元素都是字符串

谢谢大佬指点,学习了

笑,眼淚并存 2022-05-04 10:00:00

arr.toString()。split(“,”)。sort((a,b)=> {return ab})

你可能后面需要 arr.toString().split(",").sort((a,b)=>{ return a-b}).map(Number)
不然数组元素都是字符串 结果并没有去重 还有两个2 5和12

羁客 2022-05-04 08:55:00

假面具 2022-05-04 02:02:06
arr.toString().split(",").sort((a,b)=>{ return a-b})
酒废 2022-05-03 10:35:50

~没有更多了~

关于作者

眼泪都笑了

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文