Owthaman Rooben
Owthaman Rooben

Reputation: 81

Accessing multidimensional array with an array

If the following is my array of question, how can I get the value in the position [0][2][1] by supplying the index values in an array eg:answer = [0, 2, 1].

var question = [ [ ['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x'] ], [ ['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x'] ], [ ['x', 'x', 'x'], ['x', 'x', 'x'], ['x', 'x', 'x'] ] ]; var answer = [0,2,1]; question.get(answer); // Is there a way like this?

Is there way like question.get(answer) or question.get([0, 2, 1])?

Upvotes: 0

Views: 51

Answers (3)

Nina Scholz
Nina Scholz

Reputation: 386540

You could use Array#reduce, because you can use the question array as input and get the value as result by iterating the given answer array.

var question = [[['000', '001', '002'], ['010', '011', '012'], ['020', '021', '022']], [['100', '101', '102'], ['110', '111', '112'], ['120', '121', '122']], [['200', '201', '202'], ['210', '211', '212'], ['220', '221', '222']]],
    answer = [0, 2, 1],
    getItem = function (array, path) {
        return path.reduce(function (a, p) { return a[p]; }, array);
    };

console.log(getItem(question, answer));

ES6

var question = [[['000', '001', '002'], ['010', '011', '012'], ['020', '021', '022']], [['100', '101', '102'], ['110', '111', '112'], ['120', '121', '122']], [['200', '201', '202'], ['210', '211', '212'], ['220', '221', '222']]],
    answer = [0, 2, 1],
    getItem = (array, path) => path.reduce((a, p) => a[p], array);

console.log(getItem(question, answer));

Upvotes: 0

Redu
Redu

Reputation: 26161

Let's have some fun...

Object.prototype.getNestedValue = function(...a) {
  return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};

var question = [
      [
        ['1', '2', '3'],
        ['4', '5', '6'],
        ['7', '8', '9']
      ],
      [
        ['a', 'b', 'c'],
        ['d', 'e', 'f'],
        ['g', 'h', 'i']
      ],
      [
        [':', ',', '?'],
        ['#', '$', '%'],
        ['+', '!', '&']
      ]
    ];
console.log(question.getNestedValue(...[0,2,1]));
console.log(question.getNestedValue(...[1,2,0]));
console.log(question.getNestedValue(...[2,0,1]));

Upvotes: 0

Niles Tanner
Niles Tanner

Reputation: 4021

There's a hard coded way:

question[answer[0]][answer[1]][answer[2]];

or for any length of a array or nested array:

  var question = [
      [
        ['x', 'x', 'x'],
        ['x', 'x', 'x'],
        ['x', 'x', 'x']
      ],
      [
        ['x', 'x', 'x'],
        ['x', 'x', 'x'],
        ['x', 'x', 'x']
      ],
      [
        ['x', 'x', 'x'],
        ['x', 'x', 'x'],
        ['x', 'x', 'x']
      ]
    ];

var answer = [0,2,1];

    var getanswer= function(answerinput,questioninput){
      var val = questioninput;
      answerinput.forEach(function(item){
        val = val[item];
      });
      return val;
    }


    console.log(getanswer(answer,question));

Upvotes: 1

Related Questions