how to compare between two array that is inside one same array? [duplicate]

Solution 1:

ES6, a propoosal with Array#includes

The includes() method determines whether an array includes a certain element, returning true or false as appropriate.

On every loop of aa, reduce adds the element to the result array if the value is found in the test array bb. If not found, the former result is returned.

var aa = ['a','b','c','d'],
    bb = ['b','d','f','h'],
    cc = aa.reduce((r, a) => bb.includes(a) && r.concat(a) || r, []);

console.log(cc);

Just a smarter approach with using a single array which contains all arrays.

var aa = ['a','b','c','d'],
    bb = ['b','d','f','h'],
    result = [aa, bb].reduce((a, b) => a.filter(c => b.includes(c)));

console.log(result);

Solution 2:

Reduce is designed to return a single value from a list of items. So filter makes much more sense here.

A good use for reduce would be to return the total number of common elements. Check it out here: https://jsfiddle.net/c69vgzL4/

var a = ['a','b','c','d']
var b = ['b','d','f','h']

var number_of_common = b.reduce(function(prev, next) {
    return prev + (a.indexOf(next) + 1 ? 1 : 0)
}, 0)

$('body').html(number_of_common)

Solution 3:

Not only two arrays but for an intersection of n arrays... Let's invent Array.prototype.intersect()

Array.prototype.intersect = function(...a) {
  return [this,...a].reduce((p,c) => p.filter(e => c.includes(e)));
}

var arrs = [[0,2,4,6,8],[4,5,6,7],[4,6]],
     arr = [0,1,2,3,4,5,6,7,8,9];

console.log(JSON.stringify(arr.intersect(...arrs)));

// or just do

console.log(JSON.stringify(["a","b","c","d"].intersect(["b","d","f","h"])));