我正在尝试从数组列表中删除重复项。我尝试这样做的方法是使用reduce创建一个空数组,将所有未定义的索引推送到该数组。我收到了错误
if(acc[item]===undefined){
^
TypeError: Cannot read property '1' of undefined
我的功能如下:
function noDuplicates(arrays) {
var arrayed = Array.prototype.slice.call(arguments);
return reduce(arrayed, function(acc, cur) {
forEach(cur, function(item) {
if (acc[item] === undefined) {
acc.push(item);
}
return acc;
});
}, []);
}
console.log(noDuplicates([1, 2, 2, 4], [1, 1, 4, 5, 6]));
答案 0 :(得分:6)
首先连接两个数组,然后使用filter()过滤掉唯一的项目 -
var a = [1, 2, 2, 4], b = [1, 1, 4, 5, 6];
var c = a.concat(b);
var d = c.filter(function (item, pos) {return c.indexOf(item) == pos});
console.log(d);

答案 1 :(得分:5)
使用reduce
的任何原因?因为我们可以通过先合并这两个arrays
然后使用Set
删除重复的密钥来轻松完成此操作。
检查一下:
function noDuplicates(a, b){
var k = a.concat(b);
return [...new Set(k)];
}
console.log(noDuplicates([1,2,2,4],[1,1,4,5,6]));

检查DOC,how Set works。
答案 2 :(得分:3)
您如何调用方法以及从以下位置返回 acc 的位置存在许多问题:
function noDuplicates(arrays) {
var arrayed = Array.prototype.slice.call(arguments);
// reduce is a method of an array, so call it as a method
// return reduce(arrayed, function(acc, cur) {
return arrayed.reduce(function(acc, cur) {
// Same with forEach
cur.forEach(function(item) {
if (acc[item] === undefined) {
acc.push(item);
}
// Return acc from the reduce callback, forEach returns undefined always
// return acc;
});
return acc;
}, []);
}
console.log(noDuplicates([1, 2, 2, 4], [1, 1, 4, 5, 6]));

您还可以使用调用直接在参数上调用 reduce :
Array.prototype.reduce.call(arguments, function(acc, curr) {
// ...
});
上面的代码会运行,但它并没有产生正确的输出作为测试:
if (acc[item] === undefined)
没有做你想做的事。您需要做的是记住每个值,如果之前没有看到它,只将其推送到 acc :
function noDuplicates(arrays) {
var arrayed = Array.prototype.slice.call(arguments);
var seen = {};
return arrayed.reduce(function(acc, cur) {
cur.forEach(function(item) {
if (!seen[item]) {
acc.push(item);
seen[item] = true;
}
});
return acc;
}, []);
}
console.log(noDuplicates([1, 2, 2, 4], [1, 1, 4, 5, 6]));

其他一些方法:
// A more concise version of the OP
function noDupes() {
return [].reduce.call(arguments, function(acc, arr) {
arr.forEach(function(value) {
if (acc.indexOf(value) == -1) acc.push(value);
});
return acc;
},[]);
}
console.log(noDupes([1, 2, 2, 4], [1, 1, 4, 5, 6]));
// Some ECMAScript 2017 goodness
function noDupes2(...args){
return [].concat(...args).filter((v, i, arr) => arr.indexOf(v)==i);
}
console.log(noDupes2([1, 2, 2, 4], [1, 1, 4, 5, 6]));

答案 3 :(得分:1)
我的解决方法是-
var numbers = [1, 1, 2, 3, 4, 4];
function unique(array){
return array.reduce(function(previous, current) {
if(!previous.find(function(prevItem){
return prevItem === current;
})) {
previous.push(current);
}
return previous;
}, []);
}
unique(numbers);
答案 4 :(得分:0)
寻找一个更平滑的解决方案来解决MDN的完全相同的问题,我想出了一个解决方案,我觉得它很简单也很不错。我还刚刚在MDN中对其进行了更新,并希望在此处进行共享(我真的是新手,对不起,如果做错了什么事
let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd'];
var myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
if (accumulator.indexOf(currentValue) === -1) {
accumulator.push(currentValue);
}
return accumulator
}, [])
console.log(myOrderedArray);
(我真的很陌生,希望能帮上忙)