2015-05-03 6 views
5

Ho due array, uno è un array multidimensionale, l'altro un array intero che memorizza una posizione nel primo da leggere e modificare. Posso leggere, usando una variabile separata, ma non ho idea di come modificare. Esempio:Ottieni il valore dall'array usando l'array intero per la posizione javascript

var loc = [ 2, 4]; 
var groups = [ 
     ["Samantha", "Janice", "Lisa", "Wendell", "Laura"], 
     ["Rachel", "John", "Smithy"], 
     ["Mandy", "Randy", "Jamal", "Erica"] 
]; 

In questo esempio come avrei potuto modificare il valore in gruppi, in corrispondenza della posizione memorizzato nella variabile loc:

groups[2][4] 

Ricordo inoltre che gruppo non è necessariamente 2 dimensionale per tutto il tempo.

+2

'gruppi [2] [4]' sarà 'indefinito',' gruppi [2] [3] 'tuttavia sarà' "Erica" ​​' –

+0

sì, lol, ci siamo persi. grazie –

+0

questa è una semplice domanda JS, non ha nulla a che fare con Processing.js in particolare. –

risposta

1
function edit (toBeEdited, indexes, value) { 
    var array = toBeEdited, 
     len = indexes.length - 1, 
     i = 0, 
     idx = null; 

    for (; i < len; i += 1) { 
     idx = indexes[i]; 

     if (idx in array) { 
     array = array[idx]; 
     } else { 
     throw new Error("index out of bounds"); 
     } 
    } 

    idx = indexes[len]; 
    if (idx in array) { 
    array[idx] = value; 
    } else { 
    throw new Error("index out of bounds"); 
    } 
} 

var loc = [ 2, 3 ]; 
var groups = [ 
     ["Samantha", "Janice", "Lisa", "Wendell", "Laura"], 
     ["Rachel", "John", "Smithy"], 
     ["Mandy", "Randy", "Jamal", "Erica"] 
]; 

edit(groups, loc, "Anna"); // will replace "Erica" with "Anna" 
+0

grazie, questo mi ha aiutato a capirlo. –

0

Grazie, questo è quello che ho capito:

var edit = function(toBeEdited, indexes, value){ 
    var gL=value; 

    var tgL; 
    for (var x=0; x < indexes.length; x++){ 
     var n=indexes.length-1-x; 

     tgL=toBeEdited; 
     for (var y=0; y < n; y++){ 
      tgL=tgL[indexes[y]]; 
     } 

     tgL[indexes[n]]=gL; 
     gL=tgL; 
    } 

    return tgL; 
}; 
0

Semplicemente passo nella matrice nidificato fino a raggiungere la profondità desiderata:

function update(data, pos, newValue) { 
    pos = pos.slice(); 
    while(pos.length > 1) { 
    data = data[pos[0]]; 
    pos.splice(0,1); 
    } 
    data[pos[0]] = newValue; 
} 

e ora possiamo eseguire

var loc = [ 2, 3 ]; 
var groups = [ 
    ["Samantha", "Janice", "Lisa", "Wendell", "Laura"], 
    ["Rachel", "John", "Smithy"], 
    ["Mandy", "Randy", "Jamal", "Erica"] 
]; 
update(groups, loc, "jehosephat"); 

e quindi se si consolle il registro cosa sono io n groups[2][3] vedremo il valore aggiornato. L'idea che implementa è "abbiamo una lista di posizioni sempre più profonde e una serie di matrici di [...] dati", quindi continuiamo semplicemente a rebinding dei dati dell'array finché non rimane un solo livello, che è dove noi troveremo il valore da aggiornare.

Problemi correlati