简体   繁体   中英

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=[];
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???"**);

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] + '].');

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!

ps now the function returns a STRING value with all indexes separated by comma, you can simply edit it to returns an object

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

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM