尝试在js中进行代码质询,获得意外结果 -

时间:2017-01-19 09:43:20

标签: javascript algorithm functional-programming

目标是创建一个名为destroyer的函数,该函数在数组初始数组参数之后过滤所有参数。

我不是很擅长函数式编程,所以我的答案不起作用,但是我得到了一些我不理解的鱼类结果。这是我的职责:

function destroyer(arr) {
  var count = 1;
  var result = arr;
  return result.reduce(function(val){
    if (count < arguments.length){
      console.log('count is ' + count);
      console.log("filtering " + arguments[count]);
       result = result.filter(function(val){val!=arguments[count]});
       count += 1;
       return result;

    }
    else {
      return result;
    }

  }, count);
}

给定destroyer([1, 2, 3, 1, 2, 3], 2, 3);,此值为[],而应返回[1,1]

我的控制台记录以下内容:

"count is 1"
"filtering 1"
"count is 2"
"filtering 1"
"count is 3"
"filtering 1,2,3,1,2,3"

我不明白:

  1. 为什么条件甚至在count为3时进行评估?我的if语句有< arguments.length(即3),而不是<=
  2. 鉴于输入destroyer([1, 2, 3, 1, 2, 3], 2, 3);,为什么没有参数[count](应限制在1 - 2之间)返回控制台日志&#34;过滤2&#34; ...&#34;过滤3&#34; ...(没有别的......我不知道为什么最后一个日志会出现)。
  3. 关于最后一个日志...是否因为参数[3]而返回?不应该出现未定义的内容吗?

4 个答案:

答案 0 :(得分:2)

这里的问题是你在一个函数中有一个嵌套函数,并且DELETE /products/{id}/features/{featureId}对象的值在两个闭包内都是不同的。

我建议将它们存储在局部变量中,而不是重复使用arguments

我在控制台中干了你的代码,并为第一次运行附加了arguments对象和其他变量的值的屏幕截图,供您理解。

enter image description here

注意arguments行之前和之后arguments的值如何变化。

答案 1 :(得分:1)

我会尽力帮助你。 1)参数是4,而不是3.添加

  console.log(arguments);
  console.log(arguments.length);

你会亲眼看到它。第一个参数是函数reduce的累加器。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

答案 2 :(得分:1)

    function destroyer(arr) {
      var count = 1;
      var result = arr;
      var args = arguments; //keep reference of original passed arguments;
      return result.reduce(function(val){
          //use args not arguments because here arguments 
          //will refer to the arguments of the inner function
        if (count < args.length){
          console.log('count is ' + count);
          console.log("filtering " + args[count]);
           result = result.filter(function(val){return val!=args[count]});
           count += 1;
           return result;

        }
        else {
          return result;
        }

      }, count);
    }

    destroyer([1, 2, 3, 1, 2, 3], 2, 3);

答案 3 :(得分:-1)

我的解决方案:

&#13;
&#13;
function removeAll(_arr, _rem)
{
  while(_arr.indexOf(_rem) !== -1)
  {
    var i = _arr.indexOf(_rem);
    _arr.splice(i,1);
  }
  return _arr;
}

function destroyer(_arr, _remA, _remB)
{
  var arr = removeAll(_arr, _remA);
  arr = removeAll(arr, _remB);
  return arr;
}

var arr = destroyer([1,2,3,1,2,3], 2, 3);

console.log(arr);

document.getElementById('divOut').innerHTML = 'destroyer([1,2,3,1,2,3], 2, 3) -> ' + JSON.stringify(arr);
&#13;
<div id='divOut'></div>
&#13;
&#13;
&#13;

虽然我更愿意发送一系列内容来摧毁&#39; (/删除)如下:

&#13;
&#13;
    function removeAll(_arr, _rem)
    {
      while(_arr.indexOf(_rem) !== -1)
      {
        var i = _arr.indexOf(_rem);
        _arr.splice(i,1);
      }
      return _arr;
    }

    function destroyer(_arr, _remArray)
    {
      var arr = _arr.splice(0); // clone array
      for(var c = 0, length = _remArray.length; c < length; c++)
      {
        arr = removeAll(arr, _remArray[c]);
      }
      return arr;
    }

    var arr = destroyer([1,2,3,4,5,1,2,3,4,5], [2,3,5]);

    console.log(arr);

    document.getElementById('divOut').innerHTML = 'destroyer([1,2,3,4,5,1,2,3,4,5], [2,3,5]) -> ' + JSON.stringify(arr);
&#13;
<div id="divOut"></div>
&#13;
&#13;
&#13;