我是 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/