Remove Duplicates From Arrays Using Reduce
Solution 1:
First concatenate the two arrays, next use filter() to filter out only the unique items-
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);
Solution 2:
There are a number of issues with how you're calling methods and where you return acc from:
functionnoDuplicates(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]));
You could also call reduce directly on arguments using call:
Array.prototype.reduce.call(arguments, function(acc, curr) {
// ...
});
The above makes your code run, but it doesn't produce the correct output as the test:
if (acc[item] === undefined)
doesn't do what you want. What you need to do is remember each value and only push it to acc if it's not been seen before:
functionnoDuplicates(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]));
Some other approaches:
// A more concise version of the OPfunctionnoDupes() {
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 goodnessfunctionnoDupes2(...args){
return [].concat(...args).filter((v, i, arr) => arr.indexOf(v)==i);
}
console.log(noDupes2([1, 2, 2, 4], [1, 1, 4, 5, 6]));
Solution 3:
Any reason of using reduce
? because we can do this easily by first merging these two arrays
then by using Set
to remove the duplicate keys.
Check this:
functionnoDuplicates(a, b){
var k = a.concat(b);
return [...newSet(k)];
}
console.log(noDuplicates([1,2,2,4],[1,1,4,5,6]));
Check the DOC, how Set works.
Solution 4:
My Solution is -
var numbers = [1, 1, 2, 3, 4, 4];
functionunique(array){
returnarray.reduce(function(previous, current) {
if(!previous.find(function(prevItem){
return prevItem === current;
})) {
previous.push(current);
}
return previous;
}, []);
}
unique(numbers);
Solution 5:
looking for a smoother solution for MDN's exact same problem, I've came up with that solution, I find it simple and nice. I have also just updated it in MDN and wanted to share it here (I'm really new to that stuff, so sorry if did something wrong)
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);
(I'm really new to this, hope it'd help)
Post a Comment for "Remove Duplicates From Arrays Using Reduce"