找到多个数组的差异。使用reduce

时间:2017-05-04 23:39:01

标签: javascript underscore.js

我正在尝试使用reduce重新创建下划线js函数差异。 差异采用多个数组并返回与第一个数组类似的所有值。所以[1,2],[2,3],[1,3]应该吐出[1,2,2,1]。

我正在考虑循环遍历每个子数组(rest),如果我的子元素的值在我的第一个数组中有一个索引,那么我会将该元素推送到我的累加器值(这是一个空数组)。

某些原因我没有得到我想要的预期输出[1,2,3,2,1,2]。 相反,我得到[[1,2],[2,4],[1,2]]。任何人都可以使用reduce重写这个重写。谢谢。

function difference(arrays){
var arrayed=Array.prototype.slice.call(arguments);
var first=arrayed[0];
var rest=arrayed.slice(1);

return reduce(first,function(acc,cur){
  forEach(rest,function(sub){
    if (sub.indexOf(cur)>-1){
      acc.push(sub);
    }});
    return acc;
  },[]);
}

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

我知道im调用forEach的方式不同但是因为我自己的forEach版本接受了两个参数。

3 个答案:

答案 0 :(得分:1)

这是一个解决方案:

function difference(arrays){
  var arrayed = Array.prototype.slice.call(arguments);
  var first = arrayed.splice(0,1)[0]; // edit, thanks robG
  var tmp = [];

  return arrayed.reduce(function(acc, arr) {
    return acc.concat(arr.filter(function(el) {
      return first.includes(el);
    }));
  }, first);
}

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

在'rest'数组上使用javascript reduce方法,使第一个数组成为累加器的默认值,使用第一个数组过滤数组并将结果连接到累加器。

希望它有所帮助,
最好的问候

答案 1 :(得分:1)

可以试试这个

function difference(arrays){
  var arrayed=Array.prototype.slice.call(arguments);
  var first=arrayed[0];
  var rest=arrayed.slice(1);

  return first.concat(rest.reduce(function(acc, cur, curIndex, array){
    first.forEach(function(eachEle){
      if(cur.indexOf(eachEle) > -1 )
        acc.push(cur[cur.indexOf(eachEle)]);
    });
    return acc;
  }, []));
}

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

答案 2 :(得分:1)

对于你的previous question,你需要在数组上调用数组方法,而不是将它们作为参数传递,所以不能

return reduce(first,function(acc,cur){...})

return first.reduce(function(acc,cur){...});

在你的功能中:

var first=arrayed[0];
var rest=arrayed.slice(1);

可以使用splice替换为一步:

var first = arrayed.splice(0, 1)

并使用 arrayed 代替 rest 。但无论如何也没有必要。如果没有提供累加器,则使用第一个值,因此(对某些变量进行重命名):

function difference(){
  var args = Array.prototype.slice.call(arguments);

  return args.reduce(function(acc, cur){
    cur.forEach(function(value){
      if (acc.includes(value)){
        acc.push(value);
      }
    });
    return acc;
  });
}

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