Tuesday, May 14, 2024
 Popular · Latest · Hot · Upcoming
6
rated 0 times [  9] [ 3]  / answers: 1 / hits: 28083  / 8 Years ago, thu, may 19, 2016, 12:00:00

I am aware of this question, simplest code for array intersection but all the solutions presume the number of arrays is two, which cannot be certain in my case.



I have divs on a page with data that contains arrays. I want to find the values common to all arrays. I do not know how many divs/arrays I will have in advance. What is the best way to calculate values common to all arrays?



var array1 = [Lorem, ipsum, dolor];
var array2 = [Lorem, ipsum, quick, brown, foo];
var array3 = [Jumps, Over, Lazy, Lorem];
var array4 = [1337, 420, 666, Lorem];
//Result should be [Lorem];


I found another solution elsewhere, using Underscore.js.



var arrayOfArrays = [[4234, 2323, 43], [1323, 43, 1313], [23, 34, 43]];
_.intersection.apply(_, arrayOfArrays)
//Result is [43]


I've tested this with simple dummy data at my end and it seems to work. But for some reason, some of the arrays I'm producing, which contain simple strings, also automatically include an added value, equals: function:



[Dummy1, Dummy2, Dummy3, equals: function]


And whenever I use the Underscore.js intersection method, on an array of arrays, I always get [equals: function] in dev tools, and not - if Dummy3 is common to all arrays - [Dummy3].



So TL;DR is there another solution to array intersection that would suit my case? And can anyone explain what [equals: function] means here? When I expand the item in the dev tools, it produces an empty array and a list of methods available on arrays (pop, push, shift etc), but these methods are all faded out, while equals: function is highlighted.


More From » arrays

 Answers
4

I wrote a helper function for this:



function intersection() {
var result = [];
var lists;

if(arguments.length === 1) {
lists = arguments[0];
} else {
lists = arguments;
}

for(var i = 0; i < lists.length; i++) {
var currentList = lists[i];
for(var y = 0; y < currentList.length; y++) {
var currentValue = currentList[y];
if(result.indexOf(currentValue) === -1) {
var existsInAll = true;
for(var x = 0; x < lists.length; x++) {
if(lists[x].indexOf(currentValue) === -1) {
existsInAll = false;
break;
}
}
if(existsInAll) {
result.push(currentValue);
}
}
}
}
return result;
}


Use it like this:



intersection(array1, array2, array3, array4); //[Lorem]


Or like this:



intersection([array1, array2, array3, array4]); //[Lorem]


Full code here



UPDATE 1



A slightly smaller implementation here using filter


[#62106] Tuesday, May 17, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
sabrina

Total Points: 92
Total Questions: 92
Total Answers: 85

Location: Palestine
Member since Thu, Feb 2, 2023
1 Year ago
;