Javascript 有没有办法过滤掉数组中多次出现的元素?

Javascript 有没有办法过滤掉数组中多次出现的元素?,javascript,Javascript,我正在学习在freecodecamp上编码,我的任务是完成一项任务。给你 创建一个函数,该函数接受两个或多个数组并返回对称差分数组(△ 或⊕) 提供的阵列的名称 给定两个集合(例如集合A={1,2,3}和集合B={2,3,4}), 两个集合的数学术语“对称差”是 两个集合中的任何一个,但不同时在两个集合中的元素(A△ B= C={1,4})。对于每一个额外的对称差(比如 在集合D={2,3})上,您应该获得包含以下元素的集合 在两个集合中的任何一个集合,但不是两个集合(C△ D={1,4}△ {

我正在学习在freecodecamp上编码,我的任务是完成一项任务。给你

创建一个函数,该函数接受两个或多个数组并返回对称差分数组(△ 或⊕) 提供的阵列的名称

给定两个集合(例如集合A={1,2,3}和集合B={2,3,4}), 两个集合的数学术语“对称差”是 两个集合中的任何一个,但不同时在两个集合中的元素(A△ B= C={1,4})。对于每一个额外的对称差(比如 在集合D={2,3})上,您应该获得包含以下元素的集合 在两个集合中的任何一个集合,但不是两个集合(C△ D={1,4}△ {2, 3} = {1,2,3,4})

我尝试的是将arguments对象的所有元素合并。我尝试使用本机筛选方法筛选出数组中出现多次的元素。下面是我目前尝试的内容

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

有人能帮我看一下吗?非常感谢!

您可以先过滤
a
,然后过滤
b
,并计算结果

功能对称性差异(a,b){
函数未插入(集合){
返回函数(值){
返回集合。indexOf(值)=-1;
}
}
返回a.filter(isNotInSet(b)).concat(b.filter(isNotInSet(a));
}
log(对称性差异([1,2,3],[2,3,4]);//[1,4]

log(symetraldifference([1,4],[2,3]);//[1,4,2,3]
我认为这一个适合您

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]
它适用于两个以上的输入阵列,正如您的任务所述:

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

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

注意,这只适用于整数。

对于整数数组的排序,请参见

希望这有帮助。

console.log(sym([1,2,3],[5,2,1,4]))
函数sym(){
变量计数={}
对于(var i=0;i我建议

1) 使用filter和indexOf查找重复项列表,然后

2) 使用筛选和排序返回最终结果,如下所示:

function symmetricalDiff(a, b){
    var common = a.concat(b)
        .filter(function(d, index, inputArray){ 
            return inputArray.indexOf(d) != index
        });
    return (common.length==0) ? a.concat(b).sort() : 
        a.concat(b).filter(function(d){ return !common.includes(d)}).sort();
}
console.log(symmetricalDiff([1,2,3], [2,3,4]));  // [1, 4]
console.log(symmetricalDiff([1,4], [2,3]));       // [1, 4, 2, 3]

多么优雅的解决方案!非常感谢!
function symmetricalDiff(a, b){
    var common = a.concat(b)
        .filter(function(d, index, inputArray){ 
            return inputArray.indexOf(d) != index
        });
    return (common.length==0) ? a.concat(b).sort() : 
        a.concat(b).filter(function(d){ return !common.includes(d)}).sort();
}
console.log(symmetricalDiff([1,2,3], [2,3,4]));  // [1, 4]
console.log(symmetricalDiff([1,4], [2,3]));       // [1, 4, 2, 3]