'To find Index of Multidimensional Array in Javascript
I have created a multidimensional array in JavaScript and I want to find the exact index of specific value. That value will be user input.
var array = [];
var k = 0;
for (var i = 0; i < 10; i++) {
array[i] = [];
for (var j = 0; j < 100; j++) {
k = k + 1
array[i].push(k);
}
}
var index = array.indexOf(`**"What to insert here???"**`);
Solution 1:[1]
JSFiddle
/**
* Index of Multidimensional Array
* @param arr {!Array} - the input array
* @param k {object} - the value to search
* @return {Array}
*/
function getIndexOfK(arr, k) {
for (var i = 0; i < arr.length; i++) {
var index = arr[i].indexOf(k);
if (index > -1) {
return [i, index];
}
}
}
// Generate Sample Data
var k = 0;
var array = [];
for (var i = 0; i < 10; i++) {
array[i] = [];
for (var j = 0; j < 100; j++) {
k = k + 1;
array[i].push(k);
}
}
var needle = 130;
var result = getIndexOfK(array, needle);
console.log('The value #' + needle + ' is located at array[' + result[0] + '][' + result[1] + '].');
Solution 2:[2]
this example seems to work well also with IRREGULAR multidimentional array:
function findIndex(valueToSearch, theArray, currentIndex) {
if (currentIndex == undefined) currentIndex = '';
if(Array.isArray(theArray)) {
for (var i = 0; i < theArray.length; i++) {
if(Array.isArray(theArray[i])) {
newIndex = findIndex(valueToSearch, theArray[i], currentIndex + i + ',');
if (newIndex) return newIndex;
} else if (theArray[i] == valueToSearch) {
return currentIndex + i;
}
}
} else if (theArray == valueToSearch) {
return currentIndex + i;
}
return false;
}
var a = new Array();
a[0] = new Array(1, 2, 3, 4, 5);
a[1] = 'ciao';
a[2] = new Array(new Array(6,7),new Array(8,9),10);
var specificIndex = findIndex('10', a);
i wrote this speedly so everyone is invited to improve this function!
p.s. now the function returns a STRING value with all indexes separated by comma, you can simply edit it to returns an object
Solution 3:[3]
On jsfiddle
function indexOf2d(arr, val) {
var index = [-1, -1];
if (!Array.isArray(arr)) {
return index;
}
arr.some(function (sub, posX) {
if (!Array.isArray(sub)) {
return false;
}
var posY = sub.indexOf(val);
if (posY !== -1) {
index[0] = posX;
index[1] = posY;
return true;
}
return false;
});
return index;
}
console.log(indexOf2d(array, 50));
Solution 4:[4]
My code does like a PROCV in MS Excel... and identifies the Index searching only in the first column. Maybe help you (or others).
var convertToRoman = function (valueLimitTen) {
var convertTable = [ [1, "I"],
[2, "II"],
[3, "III"],
[4, "IV"],
[5, "V"],
[6, "VI"],
[7, "VII"],
[8, "VIII"],
[9, "IV"],
[10, "X"],
];
var myIndex;
for(var i in convertTable){
if(convertTable[i][0] == valueLimitTen){
myIndex = i;
return convertTable[i][1];
}
}
}
console.log(convertToRoman(2)); //Result II
console.log(convertToRoman(10)); //Result X
Solution 5:[5]
ES6 has made this considerably easier.
function findIndexOfNestedArray(nestedArray, searchArray) {
return searchArray.findIndex(item => {
return item.length === nestedArray.length
&& item.every((a, i) => a === nestedArray[i])
})
}
Solution 6:[6]
Copy and paste this code
Replace <masterArray> with your main array (the one nesting all others)
code:
//Remove Duplicates
let stringArray = masterArray.map(item=>item.join('')); // transform all nested arrays into strings (for comparation)
let nonDuplicated = [] // temporary array to compare data
stringArray.forEach(nestedArrayString=>{
let reapeatedIndex = nonDuplicated.indexOf(nestedArrayString); // this is the comparator
if(reapeatedIndex>0){
indexToRemove = stringArray.indexOf(nestedArrayString);
console.log('---indexToRemove',indexToRemove)
stringArray.splice(indexToRemove,1);
masterArray.splice(indexToRemove,1);
}else{nonDuplicated.push(nestedArrayString)}
});
//
let lastString = stringArray.filter(foundString=>foundString===stringArray[stringArray.length-1])
if(lastString.length>1){
stringArray.splice(stringArray.length-1,1)
masterArray.splice(masterArray.length-1,1)
};
console.log('>> masterArray',masterArray)
i have been searching for a solution to remove arrays inside arrays and came with this ugly but productive solution: works with array of array (twice), but no further nor deeper nesting.
this code will transform the nested arrays into strings => record one by one into a temporary array => compare each time it records if the currently recording string is already inside the array .then if is repeated, remove from masterArray(yours) and stringArray the element
Solution 7:[7]
There's a very simple way:
[1,2] === [1,2] // > false
JSON.stringify([1,2]) === JSON.stringify([1,2]) // > true
So we could do something like:
arrays.findIndex(array => JSON.stringify(array) === JSON.stringify(arrayToCompare))
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Community |
Solution 2 | |
Solution 3 | |
Solution 4 | PedroProgrammer |
Solution 5 | melv douc |
Solution 6 | |
Solution 7 | Z3ROO |