70

I want position of the array is to be also same and value also same.

var array1 = [4,8,9,10];
var array2 = [4,8,9,10];

I tried like this

var array3 = array1 === array2   // returns false
2

10 Answers 10

174

You could use Array.prototype.every().(A polyfill is needed for IE < 9 and other old browsers.)

var array1 = [4,8,9,10];
var array2 = [4,8,9,10];

var is_same = (array1.length == array2.length) && array1.every(function(element, index) {
    return element === array2[index]; 
});

THE WORKING DEMO.

Sign up to request clarification or add additional context in comments.

6 Comments

Can i use this one. it also works fine.
This answer is also found here: stackoverflow.com/a/19746771. And note it only works for shallow equals (which is totally fine for the example the OP gave).
Only one little improvement: (array1.length === array2.length). === instead of ==.
If order isn't important: (array1.length == array2.length) && array1.every(el => array2.includes(el))
@ahmelq sorry but it won't work. [1,2,2,3] compared to [1,2,3,4] returns true
|
58

A less robust approach, but it works.

a = [2, 4, 5].toString();
b = [2, 4, 5].toString();

console.log(a===b);

4 Comments

what if the array elements are not in the same order? this would not work
works perfectly if you know that the array is in the same order (like I do). however you could sort the array elements by sort() and this should then solve the op's problem.
This approach gives the wrong answer if a = [2, 4, 5].toString() and b = ["2,4", 5].toString().
I believe JSON.jstringify would be better for a universal case. However, it is not as performant from what I understand @AndersonGreen
16
var array3 = array1 === array2

That will compare whether array1 and array2 are the same array object in memory, which is not what you want.

In order to do what you want, you'll need to check whether the two arrays have the same length, and that each member in each index is identical.

Assuming your array is filled with primitives—numbers and or strings—something like this should do

function arraysAreIdentical(arr1, arr2){
    if (arr1.length !== arr2.length) return false;
    for (var i = 0, len = arr1.length; i < len; i++){
        if (arr1[i] !== arr2[i]){
            return false;
        }
    }
    return true; 
}

2 Comments

Here's a fiddle to play with (same answer, different way to iterate): jsfiddle.net/jimschubert/85M4z
A multi-dimensional array version is available here: stackoverflow.com/questions/7837456/…
15

A more modern version:

function arraysEqual(a, b) {
  a = Array.isArray(a) ? a : [];
  b = Array.isArray(b) ? b : [];
  return a.length === b.length && a.every((el, ix) => el === b[ix]);
}

Coercing non-array arguments to empty arrays stops a.every() from exploding.

If you just want to see if the arrays have the same set of elements then you can use Array.includes():

function arraysContainSame(a, b) {
  a = Array.isArray(a) ? a : [];
  b = Array.isArray(b) ? b : [];
  return a.length === b.length && a.every(el => b.includes(el));
}

7 Comments

Unfortunately, this gives false positives. For example: arraysEqual(23, "")
This is deliberate. not an array == not an array
I think it's debatable whether or not arraysEqual should be allowed to receive non-array inputs at all. That said, it's still good to be aware of the aforementioned "gotcha".
as for me it's better - const areCollectionsSame = (a: unknown, b: unknown) => Array.isArray(a) && Array.isArray(b) ? a.length === b.length && a.every(el => b.includes(el)) : false;
Your second function also gives false positives: arraysContainSame([1,1,2], [1,2,2]). This is rarely what you want, you probably want to count multiplicity.
|
8

You could try this simple approach

var array1 = [4,8,9,10];
var array2 = [4,8,9,10];

console.log(array1.join('|'));
console.log(array2.join('|'));

if (array1.join('|') === array2.join('|')) {
	console.log('The arrays are equal.');
} else {
	console.log('The arrays are NOT equal.');
}

array1 = [[1,2],[3,4],[5,6],[7,8]];
array2 = [[1,2],[3,4],[5,6],[7,8]];

console.log(array1.join('|'));
console.log(array2.join('|'));

if (array1.join('|') === array2.join('|')) {
	console.log('The arrays are equal.');
} else {
	console.log('The arrays are NOT equal.');
}

If the position of the values are not important you could sort the arrays first.

if (array1.sort().join('|') === array2.sort().join('|')) {
    console.log('The arrays are equal.');
} else {
    console.log('The arrays are NOT equal.');
}

3 Comments

The original question stated that the position and value had to be the same. If the position is not important then you can just sort the two arrays first.
Converting to string is not reliable, as it fails when the first array is [4,8,9,10] and the second is ["4|8",9,10] for example.
This was a way easier solution for me I am comparing for exact values between two matrices and don't have bitwise OR operators in my array... @Broxzier
4

If you comparing 2 arrays but values not in same index, then try this

var array1=[1,2,3,4]
var array2=[1,4,3,2]
var is_equal = array1.length==array2.length && array1.every(function(v,i) { return ($.inArray(v,array2) != -1)})
console.log(is_equal)

Comments

2

Here goes the code. Which is able to compare arrays by any position.

var array1 = [4,8,10,9];

var array2 = [10,8,9,4];

var is_same = array1.length == array2.length && array1.every(function(element, index) {
    //return element === array2[index];
  if(array2.indexOf(element)>-1){
    return element = array2[array2.indexOf(element)];
  }
});
console.log(is_same);

3 Comments

Thanks! I'm using this! I appreciate how concise this is
The above code is more usable in many cases. I am using myself.
This won't work for these two arrays: a = [1, 2, 3, 4, 2] and b = [1, 2, 3, 4, 3]. Your function will return true. The sort() + toString() method seems the most reliable so far.
2

Use lodash. In ES6 syntax:

import isEqual from 'lodash/isEqual';
let equal = isEqual([1,2], [1,2]);  // true

Or previous js versions:

var isEqual = require('lodash/isEqual');
var equal = isEqual([1,2], [1,2]);  // true

Comments

0
function isEqual(a) {
if (arrayData.length > 0) {
    for (var i in arrayData) {
        if (JSON.stringify(arrayData[i]) === JSON.stringify(a)) {
            alert("Ya existe un registro con esta informacion");
            return false;
        }
    }
}
}

Comments

-1

Try doing like this: array1.compare(array2)=true

Array.prototype.compare = function (array) {
    // if the other array is a falsy value, return
    if (!array)
        return false;

    // compare lengths - can save a lot of time
    if (this.length != array.length)
        return false;

    for (var i = 0, l=this.length; i < l; i++) {
        // Check if we have nested arrays
        if (this[i] instanceof Array && array[i] instanceof Array) {
            // recurse into the nested arrays
            if (!this[i].compare(array[i]))
                return false;
        }
        else if (this[i] != array[i]) {
            // Warning - two different object instances will never be equal: {x:20} != {x:20}
            return false;
        }
    }
    return true;
}

1 Comment

A rule of thumb here is not to mess with objects you don't own. Array.prototype is a built-in prototype object for type Arrays and this will cause inconsistency while working in a team.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.