Javascript 使用Reduce/Map将数组数组转换为唯一值数组

Javascript 使用Reduce/Map将数组数组转换为唯一值数组,javascript,reduce,Javascript,Reduce,我有一个数组,它需要成为一个唯一值数组 [1, 3, 2], [5, 2, 1, 4], [2, 1] 我想使用reduce/map来解决这个问题,但它似乎不起作用。我已经解决了嵌套for循环的问题,如下所示: function uniteUnique(arr) { var args = Array.from(arguments); var arr = []; for (var i = 0; i < args.length; i++) { for (var j =

我有一个数组,它需要成为一个唯一值数组

[1, 3, 2], [5, 2, 1, 4], [2, 1]
我想使用reduce/map来解决这个问题,但它似乎不起作用。我已经解决了嵌套for循环的问题,如下所示:

function uniteUnique(arr) {
  var args = Array.from(arguments);
  var arr = [];

  for (var i = 0; i < args.length; i++) {
    for (var j = 0; j < args[i].length; j++) {
      if (!arr.includes(args[i][j])) {
        arr.push(args[i][j]);
      }
    }
  }
  return arr;
} 
我还尝试使用reduce/map解决问题,使用较旧的语法,如:

function uniteUnique(arr) {
  var args = Array.from(arguments);
  return args.reduce(
    (arr, a) => a.map(n => (!arr.includes(n) ? arr.push(n) : n)),
    []
  );
}
console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]));
function uniteUnique(arr) {
  var args = Array.from(arguments);
  return args.reduce(function(arr, a) {
    return a.map(function(n) {
      if (!arr.includes(n)) {
        return arr.push(n);
      } else {
        return n;
      }
    });
  });
}
我猜我对回调函数中的return语句做得不对。感谢您的帮助。

问题在于:

 arr.includes(n)
arr
是一个数组数组,include在那里不起作用。您也永远不会通过reduce链的
arr


最容易解决的问题是:

  [...new Set(array.reduce((a, b) => a.concat(b), []))]
这只是将数组展平,为唯一性构建一个集合,并将其分散到一个数组中。或者使用迭代器的另一个优雅解决方案:

 function* flatten(arr) {
   for(const el of arr) {
      if(Array.isArray(el)) {
        yield* flatten(el);
      } else {
       yield el;
     }
   }
}

const result = [];

 for(const el of flatten(array))
   if(!result.includes(el)) result.push(el);

不要使用
array#map
而是使用
array#forEach
并在累加器中输入唯一的数字

功能单元(arr){
var args=Array.from(参数);
返回args.reduce((arr,a)=>{
a、 forEach(n=>(!arr.includes(n)?arr.push(n):n));
返回arr
},[]);
}

log(uniteUnique([1,3,2],[5,2,1,4],[2,1])你能补充一点解释吗?你的解决方案看起来非常好而且很短。事实上,我认为arr是我在初始reduce中声明的空数组,而args是我的数组。@jhazelton1是的,你是对的。你把我和奇怪的函数参数搞混了。你能解释一下为什么array#forEach在这里工作而不是array#map吗?即使是
array#map
也可以工作,但是
array#map
会为每次迭代返回新的值,这会覆盖旧的结果。所以,您需要的是一个累加器,并将您的号码wrt检查到此累加器。因此,您必须返回accumultor的值,而不是返回数组映射的结果。