目前,我正在学习在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})。
我尝试的是连接参数对象的所有元素。我正在尝试使用本机过滤器方法过滤掉数组中已经发生不止一次的元素。这是我目前尝试过的。
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);
}有人能帮我看看吗?我会很感激的!
发布于 2016-11-19 09:19:51
您可以先过滤a,然后过滤b,然后连接结果。
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]
发布于 2016-11-19 10:09:06
我想这个会对你有用的。
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]。然后,在这个整数列表中,如果某个整数不止一次出现,那么我们在两个或多个原始数组中包含了这个,所以我们需要过滤掉它们。
其结果是:
set([1,2,3], [2,3,4]);
> [1,4]它适用于两个以上的输入数组,正如您的任务所述:
创建一个包含两个或多个数组的函数.
set([1,2,3], [2,3,4,11], [5,4,8]);
> [1,5,8,11]不过,您应该在这里进行类型检查和其他错误处理。
注意,这只适用于整数.
对于整数数组的排序,请查看here。
希望这能有所帮助。
发布于 2016-11-19 10:10:51
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
})
}
https://stackoverflow.com/questions/40690830
复制相似问题