数组去重再汇总(~后续有空补充)

108 阅读1分钟

输入

var arr=[1,2,3,2,3,1,6,4,5,1];

输出

var arr=[1,2,3,6,4,5];

方法一(map/for/forEach + indexOf)

遍历输入,条件是输出数组中没有的数,放到输出数组中。

function unique(arr){
	var res=[];
	arr.map(item=>{
		if(res.indexOf(item)===-1){
			res.push(item);
		}
	});
	return res;
}; 
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr);//[1,2,3,6,4,5]

方法二(includes)

includes 检测数组是否有某个值, 和indexOf思路基本一样

function unique(arr){
	if(!Array.isArray(arr)){return false}
	var res=[];
	arr.forEach(item=>{
		if(!res.includes(item)){
			res.push(item);
		}
	})
	return res;
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr); // [1, 2, 3, 6, 4, 5]

方法三(...或者Array.from配合new Set)

利用Set的特性。先将数组转为Set,完成去重,然后在转为数组

Set: 如果传递一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空

function unique(arr){
	return Array.from(new Set(arr));
};
function unique(arr){
	return [...new Set(arr)];
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr); // [1, 2, 3, 6, 4, 5]

方法四

方法五

方法六(reduce + includes)

function unique(arr){
    return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr); // [1, 2, 3, 6, 4, 5]

总结

  • includes 的实现应该是基于indexOf。
  • 返回数组中没有就添加,最直观的做法。