为什么该值在reduce范围内未定义,但在for循环中定义?(javascript)

为什么该值在reduce范围内未定义,但在for循环中定义?(javascript),javascript,arrays,arguments,reduce,Javascript,Arrays,Arguments,Reduce,我正在尝试编写一个函数来查找数组集合中的唯一值 function uniteUnique(arr) { var args = Array.prototype.slice.call(arguments); var result = []; for (var i=0; i<args.length; i++){ console.log(args[i]); // as expected this evaluates to [1, 3, 2]

我正在尝试编写一个函数来查找数组集合中的唯一值

function uniteUnique(arr) {
 var args = Array.prototype.slice.call(arguments);
  var result = [];

  for (var i=0; i<args.length; i++){
    console.log(args[i]);     // as expected this evaluates to [1, 3, 2]
                              // [5, 2, 1, 4]
                              // [2, 1]     

  }

  args.reduce(function(arg){
    console.log(arg + ' is the arg');  //for some reason arg is undefined
    arg.map(function(val){
      if (result.indexOf(val) < 0){
        result.push(val);

      }
      return result;
    });
  }, result);
}

uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
我可以给你一个很好的帮助。reduce的回调函数应该接收两个参数,累加器和正在迭代的数组的当前值,因此我认为它应该是这样的:

function uniteUnique(arr) {
    var args = Array.prototype.slice.call(arguments);
    var result = [];
    var helper;
    for (var i=0; i<args.length; i++){
        console.log(args[i]); 
    }

    args.reduce(function(acc, arg){
    console.log(arg + ' is the arg');
    helper = arg.map(function(val){
      if (result.indexOf(val) < 0){
        result.push(val);
      }
      return result;
    });
    return acc + helper;
  }, result);
}
功能单元(arr){
var args=Array.prototype.slice.call(参数);
var结果=[];
辅助变量;

对于(var i=0;iYou定义了
args
,但没有定义
arg
?@TimothyG.
arg
被很好地定义为
reduce
回调的参数。这看起来不像
reduce
的用例。它看起来更像是
forEach
!@ibrahimmahrir不是一个大的javascript用户,所以我不知道。它只是一个s。)一个属性检查。代码中的问题是,您没有从
reduce
的回调返回任何要用作新累加器(
arg
)的内容。此代码也不起作用,因为您没有处理代码中的大象:reduce应该返回一些用作回调的第一个参数的内容(下一次迭代的累加器)!@BrunoSantos这看起来不错,但你好像忘记定义
acc
@ibrahimmahrir你完全正确,我已经修复了,要编辑answer@DavidJ.问题是我的acc工作方式不对。我已经解决了问题的答案,但我知道你必须让它工作,所以,干得好!
function uniteUnique(arr) {
    var args = Array.prototype.slice.call(arguments);
    var result = [];
    var helper;
    for (var i=0; i<args.length; i++){
        console.log(args[i]); 
    }

    args.reduce(function(acc, arg){
    console.log(arg + ' is the arg');
    helper = arg.map(function(val){
      if (result.indexOf(val) < 0){
        result.push(val);
      }
      return result;
    });
    return acc + helper;
  }, result);
}