对称差异javascript

时间:2018-02-09 10:02:09

标签: javascript

我正在尝试解决这个freecodecamp算法问题,我必须收集两个或更多数组的差异。我使用map来获得数组的差异,但问题是我只得到两个元素;

function sym(args) {
  args = [].slice.call(arguments);
  var newArr = args.map(function(el, index, arr){
    console.log(arr.indexOf(arr[index]));

    if(arr.indexOf(arr[index] === -1 )){
    //  console.log(arr[index]);
      return args.push(arr[index]);
    }
  });

return newArr; // my newArr returns [3, 4] instead of [3,4,5]

}

console.log(sym([1, 2, 3], [5, 2, 1, 4]));

//sym([1, 2, 3], [5, 2, 1, 4]) should return [3, 4, 5]
//sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]) should return [1, 2, 4, 5, 6, 7, 8, 9]

5 个答案:

答案 0 :(得分:0)

我认为你的方法不会起作用;你应该用两个数组中的elementos创建一个数组,这样一个.map就无法完成这项工作。过滤两个数组都应该有效,尽管它可能会留下足够的优化空间。

答案 1 :(得分:0)

  

我的newArr返回[3,4]而不是[3,4,5]

您正在使用map,每次迭代只返回一个值(这就是您只获得2个值的原因),在您的情况下您正在检查是否找到了索引(不是项目)

您需要连接所有数组,然后删除重复的数组

<强>级联

var newArr = args.reduce( ( a, c ) => a.concat( c ) , []);

按出现次数创建地图

var map = newArr.reduce( (a,c) => ( a[c] = (a[c] || 0) + 1, a ) , {});

迭代并过滤那些值为1的键

var output = Object.keys( map ).filter( s => map[s] === 1 ).map( Number );

<强>演示

function sym(args) 
{
    args = [].slice.call(arguments);
    var newArr = args.reduce( ( a, c ) => a.concat( c ) , []);
    var map = newArr.reduce( (a,c) => ( a[c] = (a[c] || 0) + 1, a ) , {});
    return Object.keys( map ).filter( s => map[s] === 1 ).map( Number );
}

console.log(sym([1, 2, 3], [5, 2, 1, 4]));

答案 2 :(得分:0)

您可以使用对象来计算项目,并仅返回有计数的项目。

function sym(array) {
    return array.reduce((a, b) => {
        var count = {};
        a.forEach(v => count[v] = (count[v] || 0) + 1);
        b.forEach(v => count[v] = (count[v] || 0) - 1);
        return Object.keys(count).map(Number).filter(k => count[k]);
    });
}

console.log(sym([[3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]]));

答案 3 :(得分:0)

您的功能比仅选择唯一值稍微复杂一点,因为您想要将它们过滤掉......并且还接受多个数组。这应该有用。

&#13;
&#13;
var sym = (...arrays)=>{
    //Concat Items
    const allItems = arrays.reduce((a,c)=>a.concat(c), []);
    // Identify repeated items
    const repeatedItems = allItems.filter((v,i,a)=>a.indexOf(v) !== i);
    // Filter repeated items out
    const diff = allItems.filter(item=>repeatedItems.indexOf(item) < 0);
    console.log(diff);
};

sym([1, 2, 3], [5, 2, 1, 4]); // [3,5,4]
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我想我们也可以这样做,因为我们希望在最后订购它们。

有关原始问题的更多详细信息,请查阅以下链接:FreecodeCamp Link: Symmetric Difference

const sym = (...args) => {
  // Merge all the different arrays and remove duplicate elements it means elements that are present both on two related arrays
  let tab = args.reduce((a, b) => [
    ...a.filter(i => !b.includes(i)),
    ...b.filter(j => !a.includes(j))
  ], []);
  // Then remove the rest of duplicated values and sort the obtained array
  return Array.from(new Set(tab)).sort((a, b) => a - b);
}

console.log(sym([1, 2, 3, 3], [5, 2, 1, 4])); // [3, 4, 5]
console.log(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])); // [1, 4, 5]
console.log(sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])); // [1, 2, 4, 5, 6, 7, 8, 9]

设置数据结构由于其特性而用于删除重复的值。