1

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 } 

5 Answers 5

1

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 } } 
Sign up to request clarification or add additional context in comments.

Comments

1
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); } 

Comments

0

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 } } ); 

Comments

0

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 } 

Comments

0

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.