macrolyte
macrolyte

Reputation: 352

Indexing nested arrays in JavaScript

I'm attempting to turn the array below into properties for an object, the problem I'm having is properly using nested array notation: array[x][y]

var array = [['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]];

function fromListToObject(array) {
  var result = {};
  for(var i = 0;i < array.length;i++){
    console.log(array[i]); // only here to view output
    for(var j = 0;j < array[i].length;j++){
      console.log(array[i][j]); // only here to view output
      console.log(array[i][j+1]); // only here to view output
      result[array[i][j]] = array[i][j+1];
    }
  }
  return result;
}
fromListToObject(array);

The output so far:

[ 'make', 'Ford' ] //inner array
make               //should be the key
Ford               //should be the value
Ford               //where did this come from?
undefined
[ 'model', 'Mustang' ]
model
Mustang
Mustang
undefined
[ 'year', 1964 ]
year
1964
1964
undefined
=> { '1964': undefined, //How in the heck?
  make: 'Ford',         //<--- actually what I wanted
  Ford: undefined,
  model: 'Mustang',
  Mustang: undefined,
  year: 1964 }

I did solve the assignment with forEach:

function fromListToObject(array) {
  var result = {};
  array.forEach(function(element){
    result[element[0]] = element[1];
  });
  return result;
}

and I can just capture the inner array into a temporary variable as well, so this is for my edification. Any help/hints would be greatly appreciated. Thanks.

EDIT

I just wanted to say thanks again for the answers, us rookies need guidance like yours.

Upvotes: 2

Views: 6675

Answers (3)

Telokis
Telokis

Reputation: 3389

It would be best if you did the same thing as in your foreach solution.

Simple remove the for(var j = 0;j < array[i].length;j++){ loop because it makes no sense with what you are trying to achieve.

Use array[i][0] and array[i][1] like you do in the foreach

Upvotes: 0

Aioros
Aioros

Reputation: 4383

The .forEach() solution is certainly the best and clearer way to go. If you want to use traditional loops, you don't need a nested loop. You are just going through the main array and doing a single assignment for each pair. So:

function fromListToObject(array) {
  var result = {};
  for (var i = 0; i < array.length; i++) {
    result[array[i][0]] = array[i][1];
  }
  return result;
}

Upvotes: 0

beta-developper
beta-developper

Reputation: 1774

The undefined is coming from accessing an index that doesn't exists

try this

var array = [['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]];

function fromListToObject(array) {
    var result = {};
    for (var i = 0; i < array.length; i++) { 
        for (var j = 0; j < array[i].length-1; j++) { // Change the condition here 
            result[array[i][j]] = array[i][j + 1];
        }
    }
    return result;
}
fromListToObject(array);

Upvotes: 3

Related Questions