You can use the set intersection principle to do this.
By going over each Set
in the state
using Array#reduce
we compare the old Set
from the previous iteration with the new Set
in the current iteration and only return the intersection of the two.
The first iteration does no comparison as it takes the first set as the starting point:
const state = {
aSet: new Set().add(1).add(2).add(3).add(4).add(5), // 1,2,3,4,5
bSet: new Set().add(2).add(3).add(4).add(5).add(6), // 2,3,4,5,6
cSet: new Set().add(3).add(4).add(5).add(6).add(7), // 3,4,5,6,7
dSet: new Set().add(4).add(5).add(6).add(7).add(8) // 4,5,6,7,8
}
const intersection = (sets) => {
return sets.reduce((prevSet, nextSet, idx) => {
if (idx === 0) return nextSet;
return new Set([...nextSet].filter((e) => prevSet.has(e)));
}, new Set());
}
const sets = Object.values(state);
console.log([...intersection(sets)]);
CLICK HERE to find out more related problems solutions.