Nakul Tiruviluamala
Nakul Tiruviluamala

Reputation: 565

Trouble accessing the nth element of a multidimensional array in Javascript

I am referencing the following code but am having difficulty accessing the nth element of the multidimensional array. Please see the following code for a minimum working example, with the last console.log returning "undefined" when I would expect it to return 1.

var intervaldefinitions = [
    [0,  "Unison", "Unison"],
    [1,  "m2",     "minor second"],
    [2,  "M2",     "Major second"],
    [3,  "m3",     "minor third"],
    [4,  "M3",     "Major third"],
    [5,  "P4",     "Perfect fourth"],
    [6,  "TT",     "Tritone"],
    [7,  "P5",     "Perfect Fifth"],
    [8,  "m6",     "minor sixth"],
    [9,  "M6",     "Major sixth"],
    [10, "m7",     "minor seventh"],
    [11, "M7",     "Major seventh"],
    [12, "Octave", "Octave"]
];

function intervalnametonumber(interval)
{
     var i = 0;
     for(i = 0; i < 13; i++)
     {
         if(intervaldefinitions[i][2] === interval)
              var intervalnumber = intervaldefinitions[i][0];
              return intervalnumber;
     }
}
    
console.log(intervalnametonumber("Unison"))
//Returns 0

console.log(intervalnametonumber("minor second"))
//Returns undefined, whereas I would expect it to return 1

Upvotes: 0

Views: 126

Answers (2)

swapnesh
swapnesh

Reputation: 26732

You have 2 line of codes inside your if statement so you need to wrap it in {}. If it is a single line then {} are optional.

So Either -

if(intervaldefinitions[i][2] === interval) {
  var intervalnumber = intervaldefinitions[i][0];
  return intervalnumber;
}

OR

if(intervaldefinitions[i][2] === interval)
  return intervaldefinitions[i][0];

Working Code -

  var intervaldefinitions = [
  [0, "Unison", "Unison"],
  [1, "m2", "minor second"],
  [2, "M2", "Major second"],
  [3, "m3", "minor third"],
  [4, "M3", "Major third"],
  [5, "P4", "Perfect fourth"],
  [6, "TT", "Tritone"],
  [7, "P5", "Perfect Fifth"],
  [8, "m6", "minor sixth"],
  [9, "M6", "Major sixth"],
  [10, "m7", "minor seventh"],
  [11, "M7", "Major seventh"],
  [12, "Octave", "Octave"]];

function intervalnametonumber(interval)
{
     for(var i=0; i<13;i++) {
       // console.log(intervaldefinitions[i][2])
         if(intervaldefinitions[i][2] === interval) {
              var intervalnumber = intervaldefinitions[i][0];
              return intervalnumber;
         }  
     }
}

console.log(intervalnametonumber("Unison"))

//Returns 0

console.log(intervalnametonumber("minor second"))

//Returns undefined, whereas I would expect it to return 1

Upvotes: 4

Nina Scholz
Nina Scholz

Reputation: 386660

The problem was, you return to early, in the first loop, but you need only to return on a found value.

function intervalnametonumber(interval) {
    var i = 0;
    for (i = 0; i < 13; i++) {
        if (intervaldefinitions[i][2] === interval)
            return intervaldefinitions[i][0];
    }
}

var intervaldefinitions = [[0, "Unison", "Unison"], [1, "m2", "minor second"], [2, "M2", "Major second"], [3, "m3", "minor third"], [4, "M3", "Major third"], [5, "P4", "Perfect fourth"], [6, "TT", "Tritone"], [7, "P5", "Perfect Fifth"], [8, "m6", "minor sixth"], [9, "M6", "Major sixth"], [10, "m7", "minor seventh"], [11, "M7", "Major seventh"], [12, "Octave", "Octave"]];

console.log(intervalnametonumber("Unison"));
console.log(intervalnametonumber("minor second"));

Upvotes: 3

Related Questions