user603007
user603007

Reputation: 11804

How to compare two arrays in JavaScript?

If I have two arrays as parameters how can I find the starting index where the second parameter occurs as a sub-array in the array given as the first parameter.

E.g.: [5,9,3,6,8], [3,6] should return 2.

Is there a function in JavaScript for this, or does it just loop through both of them and compare?

Upvotes: 3

Views: 287

Answers (7)

Javed Mansuri
Javed Mansuri

Reputation: 1

let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];

const compareArray = (a, b) => {
  return JSON.stringify(a) === JSON.stringify(b);
};

console.log(compareArrays(array1, array2));
console.log(compareArrays(array1, array3));

Upvotes: 0

You can use the javascript built-in String.indexOf method by converting this array to a string.

function subArrIndex(arr, subArr) {
  let a1 = arr.join(" ");
  let a2 = subArr.join(" ")

  let index = a1.indexOf(a2);

  let subStringEarlier = a1.substr(0, index);

  // count number of spaces ' '
  return subStringEarlier.split(' ').length - 1;
}

let arr = [5,9,3,6,8]
let subArr= [3,6]

console.log(subArrIndex(arr, subArr));

P.S

It will not work if the array contains space ' '. You can then use some other delimiter like , or \n.

Upvotes: 0

Felix Awere
Felix Awere

Reputation: 11

you could try this

function compareArray(arr1, arr2){
  return arr1.join("") == arr2.join("");
}

this code returns true if the array and its contents are the same and false if the arrays and its contents are not the same

Upvotes: 1

jfriend00
jfriend00

Reputation: 708176

In direct answer to your question, there is no built in function in JS to look in an array for a sub-array.

You will have to do some sort of brute force looping search like this or use some external library function that already has array comparison logic. Here's what a brute force solution in plain JS looks like:

function findSubArrayIndex(master, sub) {
    for (var m = 0; m < master.length - sub.length + 1; m++) {
        for (var s = 0; s < sub.length; s++) {
            if (master[m + s] !== sub[s]) {
                break;
            } else if (s === sub.length - 1) {
                return m;
            }
        }
    }
    return -1;
}

Working demo: http://jsfiddle.net/jfriend00/mt8WG/


FYI, here's a somewhat performance optimized version of this function:

function findSubArrayIndex(master, sub) {
    var subLen = sub.length, subFirst, m, mlen;

    if (subLen > 1) {
        subFirst = sub[0];
        for (m = 0, mlen = master.length - subLen + 1; m < mlen; m++) {
            if (master[m] === subFirst) {
                for (var s = 1; s < subLen; s++) {
                    if (master[m + s] !== sub[s]) {
                        break;
                    } else if (s === subLen - 1) {
                        return m;
                    }
                }
            }
        }
    } else if (subLen === 1) {
        subFirst = sub[0];
        for (m = 0, mlen = master.length; m < mlen; m++) {
            if (master[m] === subFirst) {
                return m;
            }
        }
    }
    return -1;
}

Working demo: http://jsfiddle.net/jfriend00/CGPtX/

Upvotes: 1

StuR
StuR

Reputation: 12238

findArrayInArray = function(a, b) {
    var ai = a.length
    ,   bi = b.length;
    for(var i=0; i<ai; i++) {
        if (a[i] === b[0]) {
            if(bi === 1) return i;
            for(var x=1; x<bi; x++) {
                if(a[i+x] === b[x]) {
                    if(x === bi-1) return i;
                } else {
                    break;
                }
            }
        }
    }
}

var arr1 = [5,9,3,6,8];
var arr2 = [3,6];

console.log(findArrayInArray(arr1,arr2)); // 2

http://jsfiddle.net/ymC8y/3/

Upvotes: 4

spirit walker
spirit walker

Reputation: 304

function index (a, b) {
    var as = new String(a),
        bs = new String(b),
        matchIndex = as.indexOf(bs);

    if (matchIndex === -1) {
        return -1;
    } else if (matchIndex === 0) {
        return 0;
    }
    return as.substring(0, matchIndex + 1).match(/,/g).length;
}

console.log(index([5,9,3,6,8], [3, 6]));

Upvotes: 1

Huy
Huy

Reputation: 11206

Try this - You loop through both arrays and compare each element:

var arr1 = [5,9,3,6,8];
var arr2 = [3,6];

findArrayInArray = function(arr1, arr2) {
  for(var i=0; i<arr1.length; i++) {
    for(var j=0; j<arr2.length; j++){
      if(arr1[i] === arr2[j]){
        return i;
      }
    }
  }
  return false;
}

findArrayInArray(arr1, arr2);

Upvotes: -3

Related Questions