javascript - 使用 javascript array.reduce 删除重复项

标签 javascript

我是 javascript 的新手,我自己从网络教程中学习它时遇到了一些挑战。请帮助我解决以下问题。

问题:

编写一个函数,它接受两个或多个数组,并按照原始提供的数组的顺序返回一个新的唯一值数组。

换句话说,所有数组中出现的所有值都应按其原始顺序包含,但最终数组中没有重复项。

唯一数字应按其原始顺序排序,但最终数组不应按数字顺序排序。

只使用 Array.reduce 来解决这个问题!您的解决方案应如下所示:

function unite(arr1, arr2, arr3) {
  return arr1;
}

unite([1, 2, 3], [5, 2, 1, 4], [2, 1]);

我无法理解如何在这里使用 reduce。与此相比,所有互联网示例都非常简单。 https://www.airpair.com/javascript/javascript-array-reduce http://adripofjavascript.com/blog/drips/boiling-down-arrays-with-array-reduce.html

我的错误解决方案:

function arrayDiff(resultArray, element){
    var idx = anotherArray.indexOf(element);
    if(idx != -1){
        resultArray.push(element);
        return resultArray;
    }
}

function unite(arr1, arr2, arr3) {
    var arr = [];
    var r1 = arr1.reduce(arrayDiff);
    var r2 = arr2.reduce(arrayDiff);
    var r3 = arr3.reduce(arrayDiff);
    arr.concat(r1).concat(r2).concat(r3);
    return arr;
}


r = unite([1, 2, 3], [5, 2, 1, 4], [2, 1]);
console.log(r);

错误:ReferenceError:未定义另一个数组

最佳答案

要处理多个数组参数,可以使用arguments .因此,您的函数可以采用 N 参数,它更通用。

然后,您可以平整所有数组参数,并开始减少您的数据。当您减少我们的数组时,您将通过排除冗余数据来创建一个新数组。因此,您将从一个 数组开始,然后通过 reduce 过程填充它。

  function unite(){
    //Flat array arguments, then process to reduce data
    return [].concat.apply([], arguments).reduce(function(result, current){
      //If my result array doesn't get current element
      return result.indexOf(current) === -1
      //concat current element to result and return it
      ? result.concat(current)
      //Otherwise, just return actual result array
      : result;
    }, []);
  }

  var array = unite([1,2], [1,6,2,3], [4,5]);

  console.log(array);
  //[1,2,6,3,4,5]

编辑 06/02/2017:

现在,您可以使用 spread operator为了处理多个参数,例如通过解构赋值。 此外,我们可以通过将 indexOf() 操作与按位运算符 ~ 结合使用来提高性能。

function unite(...data) {
  return [].concat.apply([], data).reduce((result, current) => {
    return ~result.indexOf(current)
    ? result
    : result.concat(current)
  }, []);
}

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

关于javascript - 使用 javascript array.reduce 删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929074/

相关文章:

javascript - 如何为 iOS evaluateJavaScript 抛出 javascript 错误以捕获它?

javascript - Javascript 中的无限滚动条

php - 如何获取 javascript Ajax 调用的帖子 ID?

javascript - 如何根据用户输入检索并设置该月的最后一天?

javascript 在新选项卡中打开页面并在同一选项卡上打开新链接

javascript - 为什么(JS 测试库)AVA 没有 "Suites"(或任何其他分组)?

javascript - 为什么没有为此脚本标签指定协议(protocol)

javascript - 远程表单中的远程链接 - ajax 回调仅用于提交

javascript - 未定义值 JavaScript

javascript - 移动页面在顶部时div垂直居中,但是当我们向下滚动页面时,出现错误