Reputation: 11804
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
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
Reputation: 726
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));
It will not work if the array contains space ' '
. You can then use some other delimiter like ,
or \n
.
Upvotes: 0
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
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
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
Upvotes: 4
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
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