dtgee
dtgee

Reputation: 1272

Javascript - Do something when an element in two arrays are the same?

I found a solution to where I get returned an array of elements without duplicates:

Array1 = Array1.filter(function(val) {
  return Array2.indexOf(val) == -1;
});

However, I want to modify this code just a little bit. Instead of being returned an array without duplicates, I want to do something when there is a duplicate. The problem is, I'm not sure how exactly this code works. The thing is I'm not sure how val gets set, or what it even is.

for (var i = 0; i < json.length; i++) { 
    var item = json[i];
    // if json.indexOf(val?), do something
}

Upvotes: 1

Views: 85

Answers (5)

HamidRaza
HamidRaza

Reputation: 650

var newArray = array1.filter(function(v, i) {
    return array1.indexOf(v) == i;
});

This will return only unique itesm from array1;

array1.filter(function(v, i) {
    // write your code here ('v' is individual value and 'i' is its index)
    // don't return any anything if you don't want unique array to be returned.
    // 'array1.indexOf(v) == i' checks if current value is duplicate from previous any values.
    // try putting console.log on values you don't understand like (console.log(v,i) for values of 'v' and 'i')
    return array1.indexOf(v) == i;
});

and off-curse you can loop an array with for loop as

for(i in array1){
    // where i is index of array1, to get current value use array1[i]
    if(array2.indexOf(array1[i]) >= 0){
        // do something
    }
    console.log(i);
} 

Upvotes: 1

dc5
dc5

Reputation: 12441

From MDN: indexOf

Returns the first index at which a given element can be found in the array, or -1 if it is not present.

From MDN: filter

Creates a new array with all elements that pass the test implemented by the provided function.

The first function works by returning true when an item from array1 isn't found in array2 (== -1). i.e.: Iterate through A and add anything not found in B.

So, to change to return only duplicates return true for anything that is found in both:

Array1 = Array1.filter(function(val) {
    return Array2.indexOf(val) >= 0;
});

Array1 now contains only items with duplicates.

Upvotes: 0

demee
demee

Reputation: 582

You can utilize some modern libraries... like underscorejs.

Intersection is what you're looking for i guess: http://underscorejs.org/#intersection

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]

So your code may be something like

if(_.insersection(arr1, arr2)){
  //since [] array is Falsy in JS this will work as a charm
}

Upvotes: 0

Bergi
Bergi

Reputation: 664336

Read the docs for the Array filter method then. The val parameter of the callback will be passed the single array items, i.e. json[i] or item in your case:

for (var i = 0; i < json.length; i++) { 
    var item = json[i];
    if (json.indexOf(item) >= 0) {
        // do something
    }
}

Upvotes: 1

Paul
Paul

Reputation: 141839

val is set by Array.prototype.filter, which calls the callback function on each element in the array. Since you don't want to filter you can use Array.prototype.forEach instead, which also calls the callback function once for each element in the array:

Array1.forEach(
  // This function is called once per element in Array1
  function(val){
    if(Array2.indexOf(val) != -1){ // Check if that element is also in Array2
        // `val` is in both arrays,
        // Do something with it
    }
  }
);

Upvotes: 0

Related Questions