首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以过滤掉数组中不止一次发生的元素?

问有没有一种方法可以过滤掉数组中不止一次发生的元素?
EN

Stack Overflow用户
提问于 2016-11-19 08:35:26
回答 3查看 515关注 0票数 2

目前,我正在学习在freecodecamp上编写代码,我的任务是完成一项任务。这就是了。

创建一个函数,该函数接受两个或多个数组,并返回所提供数组的对称差(或⊕)数组。 给定两个集合(例如集合A= {1,2,3}和集合B= {2,3,4}),两个集合的数学术语“对称差”是两个集合中任一集合中的元素集合,而不是这两个集合中的元素集(A =C= {1,4})。对于每一个附加的对称差(例如在集合D= {2,3}上),您应该得到集合中的元素,这些元素在这两个集合中而不是同时存在(C = {1,4} {2,3}= {1,2,3,4})。

我尝试的是连接参数对象的所有元素。我正在尝试使用本机过滤器方法过滤掉数组中已经发生不止一次的元素。这是我目前尝试过的。

代码语言:javascript
复制
function sym() {
  let args = Array.prototype.slice.call(arguments);
  return args.reduce((prev,current) => prev.concat(current),[]) //concat all arguments
              .filter((element, index, array) => array.indexOf(element) !== index);
}

有人能帮我看看吗?我会很感激的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-19 09:19:51

您可以先过滤a,然后过滤b,然后连接结果。

​

代码语言:javascript
复制
function symetricalDifference(a, b) {
    function isNotInSet(set){
        return function (value) {
            return set.indexOf(value) === -1;
        }
    }

    return a.filter(isNotInSet(b)).concat(b.filter(isNotInSet(a)));
}

console.log(symetricalDifference([1, 2, 3], [2, 3, 4])); // [1, 4]
console.log(symetricalDifference([1, 4], [2, 3]));       // [1, 4, 2, 3]

​

票数 1
EN

Stack Overflow用户

发布于 2016-11-19 10:09:06

我想这个会对你有用的。

代码语言:javascript
复制
function set() {
    let args = Array.prototype.slice.call(arguments);
    return args
        .reduce((prev, next) => prev.concat(next), [])
        .sort((a, b) => a - b)
        .filter( (el, i, array) => {
            if(i === 0) return true;
            if(el !== array[i-1]) {
                if(el !== array[i+1]) return true;
            }
        });
}

逻辑是:首先,我们需要将所有数组连接到一个,并对其进行排序,这样我们就有了按升序排列的整数,类似于这个[1,2,2,3,4,5,5]。然后,在这个整数列表中,如果某个整数不止一次出现,那么我们在两个或多个原始数组中包含了这个,所以我们需要过滤掉它们。

其结果是:

代码语言:javascript
复制
set([1,2,3], [2,3,4]);
> [1,4]

它适用于两个以上的输入数组,正如您的任务所述:

创建一个包含两个或多个数组的函数.

代码语言:javascript
复制
set([1,2,3], [2,3,4,11], [5,4,8]);
> [1,5,8,11]

不过,您应该在这里进行类型检查和其他错误处理。

注意,这只适用于整数.

对于整数数组的排序,请查看here。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2016-11-19 10:10:51

​

代码语言:javascript
复制
console.log(sym([1, 2, 3], [5, 2, 1, 4]) )
function sym() {
	var count = {}
	for (var i=0; i<arguments.length; ++i) {
		arguments[i].forEach(function(v){
			if (!count[v]) count[v] = 1
			else ++count[v]
		})
	}
	return Object.keys(count).filter(function(k) {
		return count[k] === 1
	})
}

​

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40690830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档