Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zpzxgcr opened this issue Feb 12, 2019 · 382 comments

Comments

@zpzxgcr
Copy link

zpzxgcr commented Feb 12, 2019

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

@zpzxgcr
Copy link
Author

zpzxgcr commented Feb 12, 2019

image

@zpzxgcr
Copy link
Author

zpzxgcr commented Feb 12, 2019

相关知识点

es6数组常用操作

@hejiaqian
Copy link

hejiaqian commented Feb 12, 2019

arr.toString().split(",").sort((a,b)=>{ return a-b})

@hejiaqian
Copy link

hejiaqian commented Feb 12, 2019

image

@zpzxgcr
Copy link
Author

zpzxgcr commented Feb 12, 2019

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

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

@hejiaqian
Copy link

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

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

谢谢大佬指点,学习了

@yygmind yygmind changed the title 将数组扁平化并去除其中重复数据,最终得到一个升序且不重复的数组 第11题:将数组扁平化并去除其中重复数据,最终得到一个升序且不重复的数组 Feb 12, 2019
@cjfff
Copy link

cjfff commented Feb 12, 2019

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 ]

@AprilTong
Copy link

AprilTong commented Feb 12, 2019

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
})

@zpzxgcr
Copy link
Author

zpzxgcr commented Feb 12, 2019

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

@cjfff
Copy link

cjfff commented Feb 12, 2019

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

  • -感谢斧正

@w587
Copy link

w587 commented Feb 12, 2019

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)

@jackchenl
Copy link

jackchenl commented Feb 13, 2019

递归函数解法:

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]);

@zhuzhuoxingguang
Copy link

利用前面的答案,修正一个没用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)

@sisterAn
Copy link
Collaborator

看一道面试题:

已知如下数组: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

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

@xiaoluoboding
Copy link

xiaoluoboding commented Feb 18, 2019

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

@wangweianger
Copy link

wangweianger commented Feb 18, 2019

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

@Allen3039
Copy link

Allen3039 commented Feb 18, 2019

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

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);

@xpbsm
Copy link

xpbsm commented Feb 18, 2019

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

@mydaoyuan
Copy link

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

@ihuoge
Copy link

ihuoge commented Feb 19, 2019

1550544432 1

@Jason686
Copy link

Jason686 commented Feb 19, 2019

Array.from(new Set(arr.toString().split(',').map(Number))).sort((a, b) => (a-b))

@hellojackhui
Copy link

  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);

@fan-2
Copy link

fan-2 commented Feb 19, 2019

image

@yishuihan-001
Copy link

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

@xiaochen111
Copy link

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))

@mySouler
Copy link

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

@Liubasara
Copy link

Liubasara commented Feb 20, 2019

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函数递归进行函数拍平去重加排序。这个咋样?

@weiweixuan
Copy link

// 已知如下数组:
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);

@xifenzs
Copy link

xifenzs commented Feb 20, 2019

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

@catbea
Copy link

catbea commented Oct 11, 2022 via email

@ScholatLouis
Copy link

ScholatLouis commented Oct 11, 2022 via email

@listentolife
Copy link

listentolife commented Oct 11, 2022 via email

@janyin
Copy link

janyin commented Oct 14, 2022

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

@pinelxk
Copy link

pinelxk commented Jan 30, 2023

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

@ScholatLouis
Copy link

ScholatLouis commented Jan 30, 2023 via email

@catbea
Copy link

catbea commented Jan 30, 2023 via email

@listentolife
Copy link

listentolife commented Jan 30, 2023 via email

@lunhui1994
Copy link

lunhui1994 commented Jan 30, 2023 via email

@cliYao
Copy link

cliYao commented Jan 30, 2023 via email

@QWYZ
Copy link

QWYZ commented Feb 12, 2023

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

@SceneryCN
Copy link

SceneryCN commented Feb 14, 2023

const paseArr = (arr) => { return Array.from( new Set( arr.reduce((rev, item) => { // 递归条件判断 if (item instanceof Array) { return rev.concat([...paseArr(item)]); } else { return rev.concat([item]); } }, []) ) ).sort((a, b) => a - b); };

@2791666300
Copy link

[...new Set(arr.map(item => (Array.isArray(item) ? item.flat():item)).flat())].sort((a,b) => a - b)

@catbea
Copy link

catbea commented Aug 14, 2023 via email

@ScholatLouis
Copy link

ScholatLouis commented Aug 14, 2023 via email

@listentolife
Copy link

listentolife commented Aug 14, 2023 via email

@Yangbg2018
Copy link

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

原生搞个
function hArr(arr){
var list=[]
for(let i=0;i<arr.length;i++){
if(Object.prototype.toString.call(arr[i])==='[object Array]'){
list.push(...hArr(arr[i]))
}else{
list.push(arr[i])
}
}
return [...new Set(list)].sort((a,b)=>a-b)
}

@catbea
Copy link

catbea commented Oct 11, 2023 via email

@lunhui1994
Copy link

lunhui1994 commented Oct 11, 2023 via email

@donghym
Copy link

donghym commented Oct 12, 2023

[...new Set(arr.flat(Infinity))].sort()

@Dangdtx
Copy link

Dangdtx commented Mar 14, 2024

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
[... new Set(arr.flat(4)) ]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 10]

@catbea
Copy link

catbea commented Mar 14, 2024 via email

@lunhui1994
Copy link

lunhui1994 commented Mar 14, 2024 via email

@listentolife
Copy link

listentolife commented Mar 14, 2024 via email

@cliYao
Copy link

cliYao commented Mar 14, 2024 via email

@TobinXu
Copy link

TobinXu commented May 7, 2024

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

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

image

@ScholatLouis
Copy link

ScholatLouis commented May 7, 2024 via email

@lunhui1994
Copy link

lunhui1994 commented May 7, 2024 via email

@listentolife
Copy link

listentolife commented May 7, 2024 via email

@cliYao
Copy link

cliYao commented May 7, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests