简体   繁体   中英

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.

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

Try this way also to convert your nested array to object . see fiddle https://jsfiddle.net/9cg4km2w/

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

var obj = {};
array.forEach(function(data){
    obj[data[0]] = data[1]
});
console.log(obj);

Yoy should do 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 sens with what you are trying to achieve.

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

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

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