-
-
Notifications
You must be signed in to change notification settings - Fork 3.3k
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
[js] 第15天 写一个数组去重的方法(支持多维数组) #48
Comments
function flat(arr, target) {
arr.forEach(item => {
if (Array.isArray(item)) {
flat(item, target)
} else {
target.push(item)
}
})
}
function flatArr(arr) {
let result = []
flat(arr, result)
return result
}
function uniqueArr(arr) {
return [...new Set(flatArr(arr))]
}
const result = uniqueArr([1, 2, 3, 4, [3, 4, [4, 6]]])
console.log(result) // 1,2,3,4,6 有一个兼容性不太好的写法: function uniqueArr(arr) {
return [...new Set(arr.flat(Infinity))]
} |
new set(...arr)
arr.reduce((a,b)=>{
return new set(...a.concat(b))
},[]) |
说个兼容性比较好的,当然最简单的方式还是基于 new Set [1,2,3,4,4,5,5,2].filter((item, index, arr) => arr.indexOf(item) === index) |
|
/* function getNoRepeatArr (arr, set) {
} |
// ES6
const uniqueArr = (arr) => [
...new Set(
arr.reduce(
(prev, cur) =>
Array.isArray(cur) ? prev.concat(...uniqueArr(cur)) : prev.concat(cur),
[]
)
)
];
console.log(uniqueArr([1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1, 5, 6]));
console.log(uniqueArr([1, 2, 3, 4, 4, 3, 2, 1, [1, 2, 3, [4, 3, 2, 1]]]));
console.log(
uniqueArr([
1,
2,
3,
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3]]]]]]
])
);
// ES5
const uniqueArrES5 = (arr) => {
const unique = [];
const flattedArr = arr.reduce(
(prev, cur) =>
Array.isArray(cur)
? prev.concat(uniqueArrES5(cur))
: prev.concat(cur),
[]
);
while (flattedArr.length > 0) {
const head = flattedArr.shift();
if (flattedArr.indexOf(head) < 0) {
unique.push(head);
}
}
return unique;
};
console.log(
uniqueArrES5([1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1, 5, 6])
);
console.log(uniqueArrES5([1, 2, 3, 4, 4, 3, 2, 1, [1, 2, 3, [4, 3, 2, 1]]]));
console.log(
uniqueArrES5([
1,
2,
3,
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3]]]]]]
])
); |
const flatArray = array =>
array.reduce(
(pre, item) =>
Array.isArray(item) ? [...pre, ...flatArray(item)] : [...pre, item],
[]
)
const uniqueArray = (array, fn = (a, b) => a === b) =>
array.filter(
(item, index) => array.findIndex(value => fn(value, item)) === index
)
const test = [
{ name: '2' },
{ name: '1' },
2,
3,
[4, 5, [6, 7, [8, { name: '2' }, 4, 9, [10, 9]]]]
]
console.log(uniqueArray(flatArray(test))) // [ { name: '2' }, { name: '1' }, 2, 3, 4, 5, 6, 7, 8, { name: '2' }, 9, 10 ]
console.log( // [ { name: '2' }, { name: '1' }, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
uniqueArray(flatArray(test), (a, b) => {
return a === b || (a.name && b.name && a.name === b.name)
})
) |
|
function deWeighting(arr = []) {
let targetIndex = null;
arr = arr.slice();
while ((targetIndex = arr.findIndex(Array.isArray)) > -1) {
arr.splice(targetIndex, 1, ...arr[targetIndex].flat());
}
return [...new Set(arr)]
} |
const uniqueArr = (arr) => {
let result = []
for (let i=0; i<arr.length; i++) {
arr[i] instanceof Array
? result.push(removeArr(arr[i]))
: result.indexOf(arr[i]) === -1 ? result.push(arr[i]) : null;
}
return result
} |
function distinct(a){ |
讲个比较笨的 |
|
function dup(list) {
let arr = flatten(list);
let res = simple(arr);
return res;
}
//先把他扁平化
function flatten(list) {
const res = list.reduce((prev, current) => {
let temp = current instanceof Array ? flatten(current) : current;
return prev = prev.concat(temp);
}, []);
return res;
}
function simple(arr) {
let res = new Set(arr);
return [...res];
}
dup([1,2,3, [1,3,4]]); |
function rid(arr){ |
function flat(arr, target) {
arr.forEach(item => {
if (Array.isArray(item)) {
flat(item, target)
} else {
target.push(item)
}
})
return target
}
function uniqueArr(arr) {
let result = []
let resultFilter = flat(arr, result)
return [...new Set(resultFilter)]
}
// let resultArr = uniqueArr([1, 2, 3, 4, [3, 4, [4, 6]]])
// console.log(resultArr) // 1,2,3,4,6 |
function unique(arr, index) {
if (index == arr.length) return arr;
let next = index + 1;
if (Array.isArray(arr[index])) {
arr[index] = unique(arr[index], 0);
return unique(arr, next);
} else {
let hasSame = -1;
for (let i = 0; i < index; i++) {
if (arr[i] == arr[index]) {
hasSame = i;
break;
}
}
if (hasSame > -1) { //删除
arr.splice(hasSame, 1)
return unique(arr, index);
} else {
return unique(arr, next);
}
}
}
const result = unique([1, 2, 2, 3, 4, [3, 3, 4, 4, [4, 6]]], 0)
console.log(result) // [ 1, 2, 3, 4, [ 3, 4, [ 4, 6 ] ] ] |
const uniqueArr = (arr) => [...new Set(arr.toString().split(','))]
console.log(uniqueArr([1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1, 5, 6]));
console.log(uniqueArr([1, 2, 3, 4, 4, 3, 2, 1, [1, 2, 3, [4, 3, 2, 1]]]));
console.log(
uniqueArr([
1,
2,
3,
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3]]]]]]
])
);
// [ '1', '2', '3', '4', '5', '6' ]
// [ '1', '2', '3', '4' ]
// [ '1', '2', '3' ]
|
|
/**
* 元素为非数组则直接对数组去重
* 元素为数组则对元素去重
* @param {array} arr
* @return {array}
*/
function uniqueArr(arr) {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
arr[i] = uniqueArr(arr[i]);
}
}
return Array.from(new Set(arr));
} |
|
|
//第15天 写一个数组去重的方法(支持多维数组)
function flat(arr, result) {
arr.map(item => {
if (Array.isArray(item)) {
flat(item, result);
} else {
result.push(item);
}
});
}
function flatArr(arr) {
let result = [];
flat(arr, result);
return result;
}
function uniqueArr(arr) {
return Array.from(new Set(flatArr(arr)));
}
var arr = [1, 2, [2, 3, [3, 4, 5]], 5, 5];
// console.log(uniqueArr(arr));
console.log(uniqueArr(arr)); |
//另一个flat
function flat1(arr) {
var result = [];
arr
.toString()
.split(",")
.map(item => {
result.push(Number(item));
});
return result;
}
var arr = [1, 2, [2, 3, [3, 4, 5]], 5, 5];
// console.log(uniqueArr(arr));
console.log(flat1(arr)); |
1,首先是展平多维数组。 function flat(arr) {
return arr.reduce(function (prev, curr) {
return Array.isArray(curr) ? prev.concat(flat(curr)) : prev.concat(curr)
},[]);
} 2.然后就是数组去重 function distinct(arr) {
return [...new Set(flat(arr))]
} |
应该还有很大的改进空间 var ary=[1,1,2,2,3,['a','a','c',['q','q']]];
function bar(ary){
for(let i=0;i<ary.length;i++){
if(Array.isArray(ary[i])){
bar(ary[i]);
}else{
for(let j=0;j<ary.length;j++){
if(ary[i]===ary[j]&&i!=j){
ary.splice(i,1);
}
}
}
}
} |
Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>a-b)
数组扁平化去重排序 |
function distinct(arr) {
let result = [];
let obj = {};
for (let i of arr) {
if (i instanceof Array) {
result.push(distinct(i));
} else if (!obj[i]) {
result.push(i);
obj[i] = 1;
}
}
return result;
}
console.log(distinct(arr)); |
降维+去重 const flatten = (arr) => {
const res = [ ];
arr.forEach(item=>{
Array.isArray(item) ? res.push.apply(res, flatten(item)) : res.push(item);
})
return res;
}
const distint = (arr) => {
return [...new set(arr)]
} |
const isArray = arr => Array.isArray(arr);
const removeDuplicates = function (array) {
if (!isArray(array)) {
throw new Error('传递的不是数组')
}
return core(array);
};
function core(array) {
if (!isArray(array)) {
return array;
}
const noDups = [...new Set(array)];
for (let i = 0; i < noDups.length; i++) {
noDups[i] = core(noDups[i])
}
return noDups;
} |
var str=......; |
降维:
|
|
function fn(arr) {
var newarr = new Set(arr.join(',').split(','));
return [...newarr]
} |
function flattenArray(originArray) {
let tempArr = [];
for (let item of originArray) {
if (Object.prototype.toString.call(item) === "[object Array]") {
tempArr = [...tempArr, ...flattenArray(item)]
} else {
tempArr.push(item);
}
}
return tempArr;
}
function removeDuplicatesFromArray(originArray) {
if (Object.prototype.toString.call(originArray) !== "[object Array]") {
return [originArray];
}
let flattenedArr = flattenArray(originArray);
return [...new Set(flattenedArr)]
}
let arr = [
1, 2, 3, 4, "Allen",
{ name: "Tom" },
[2, 5, 6],
[10, 5, [2, 6, 7]]
];
console.log(removeDuplicatesFromArray(arr));
|
|
var arr = [1, 2, 3, 4, [3, 4, [4, 6]]] |
function unique(arr) {
if (Array.prototype.flat !== undefined) {
return [...new Set(arr.flat(Infinity))]
}
const set = new Set(arr);
const res = [];
for (const ele of set.values()) {
res.push(Array.isArray(ele) ? unique(ele) : ele)
}
return res;
} |
function outRepeat(arr) { |
const arr = [1, 2, 3, [1, 2, 3, [1, 2]]] |
let arrays = [1,2,3,[4,5,[6,7,[8,9],1,2],3,4],5,6,[7,8],9,[0]]
let ObjType = obj => Object.prototype.toString.call(obj).replace(/\[object\s|\]/g, '');// 判断类型
function ArrayGetBack(array = null, obj = []) { // 设置默认值
if (ObjType(array) != 'Array') return TypeError(`错误:\n\t参数:${array} 不是一个数组`)// 如果 参数 array 的 类型 不等于 数组 返回一个 类型错误
array.forEach(items => {// 遍历传入的 array forEach 是对数组每一个元素执行一次函数 无法被终止 除非抛出异常
if (ObjType(items) == 'Array') ArrayGetBack(items, obj)// 如果 遍历获得的 items 类型等于一个 数组 进行迭代
else {// 如果不是一个数组
for (let i of obj) if (i == items) return // for of 遍历 可以被终止
obj.push(items) // 在 参数 obj 的 后面添加 items
}
})
return obj // 返回 obj
}
console.log(ArrayGetBack(arrays)) |
先把数组拍平
|
<script> function unique(arr){ var res = arr.filter(function(item,index,array){ return array.indexOf(item)===index }) return res; } let arr = [1,2,3,4,1,2,[1,2]]; console.log(unique(arr.flat(Infinity))); var uniqu = arr =>[...new Set(arr.flat(Infinity))]; console.log(uniqu(arr)); </script> |
ES5//ES5
function uniqueArr(arr) {
const result = [];
const dimenArr = arr.reduce(
(prev, curr) =>
Array.isArray(curr) ? prev.concat(uniqueArr(curr)) : prev.concat(curr),
[]
);
while (dimenArr.length) {
let element = dimenArr.shift();
if (!dimenArr.includes(element)) {
result.push(element);
}
}
return result;
}
console.log(uniqueArr([1, 2, 3, 4, [3, 4, [4, 6]]])); ES6// ES6
function uniqueArr(arr) {
[
new Set(
arr.reduce(
(prev, curr) =>
Array.isArray(cur)
? prev.concat(...uniqueArr(curr))
: prev.concat(cur),
[]
)
),
];
}
console.log(uniqueArr([1, 2, 3, 4, [3, 4, [4, 6]]])); |
function MyTypeof(data) { |
const arr2set = (arr = []) => {
let newArr = [];
for (let value of arr) {
if (typeof value === 'number') {
if (newArr.every(v => v !== value)) newArr.push(value);
}
else newArr.push(arr2set(value));
}
return newArr;
} |
|
看别人的结果都是一维数组,我这个去重并且保留原数组的格式(空数组去除) const unique = (arr) => {
const set = new Set()
const loop = (arr) => {
return arr.reduce((result, current) => {
if (Array.isArray(current)) {
const arrTemp = loop(current)
if (arrTemp.length > 0) result.push(arrTemp)
return result
}
if (set.has(current)) return result
set.add(current)
result.push(current)
return result
}, [])
}
return loop(arr)
}
unique([1,2,3,[1, 4, [2]],4,5], 7, 8, 7) |
var arr = [ // 1、数组扁平化 // 方法一:递归 要使用function因为this指向 不然箭头函数指向window const arr1 = [ // 去重操作 // 定义排序的顺序 console.log('------------------------------------------------------------------------------------------------'); const newArray = arr.flat().uniquee().sort(sortfn) console.log(newArray); |
// 写一个数组去重的方法 支持多维数组 |
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) |
都要用到ES6的Set对象,保存唯一的值
|
function flat(arr, newArr){ function flatArr(arr){ console.log(flatArr([1,2,3,4,[1,2,3],4,[a,b,5,[4,5,6],[1,2]]])) |
。。。人家让你们去重,谁让你们降维了,题目要求难道不是返回一个和原数组结构相同的,去重后的数组吗? let testArr = [ console.log(deSameElement(testArr)); // [ [ 1, 2, 3, 4, 5, 6 ], [ 7, 9 ], 10, 8 ] |
function arrayFlat(arr) { |
// 数组去重
function flat (arr, n = 1) {
return n > 0 ? arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flat(cur, n - 1) : cur)
}, []) : arr.slice()
}
function unique (arr) {
return [...new Set(flat(arr, Infinity))]
}
const arr = [1, 2, 3, '', '', 4, [3, 4, [4, 6, [7, 8]]], , ,]
console.log(unique(arr, Infinity)) // [1, 2, 3, '', 4, 6, 7, 8] |
第15天 写一个数组去重的方法(支持多维数组)
The text was updated successfully, but these errors were encountered: