2016-09-22 7 views
0

Was ist der schnellste Weg ist, einen Wert in einem Array an der Position zu speichern, sagen wir mal, [30] [1] [0] ...Speichern von Wert in einem mehrdimensionalen Array (Javascript)

Ich versuchte var myArray[30][1][0] = new Date(); aber es wird nicht funktionieren, ohne vorher var myArray = []; myArray[30] = []; myArray[30][1] = []; zu tun.

Was mache ich falsch?

EDIT: Mein Problem ist, dass ich nicht weiß, erstens, wenn die Variable myArray bereits existiert und, zweitens, wenn es bereits einen Wert an der Position gibt, sagen wir, [29] [2] [15] Ich möchte nicht überschreiben.

+0

Warum versuchen Sie, einem mehrdimensionalen Array ein Datum zuzuweisen? –

+0

Kurze Antwort: Weil ich Hunderte von Daten auf einem NodeJs-Back-End verwalte, die als JSON an das Frontend und dann zurück an den NodeJS-Server gesendet werden müssen. – Emilio

Antwort

0

Der richtige Weg zu tun, was Sie würden wollen:

var array = [[[new Date()]]]; 

jedoch das resultierende mehrdimensionales Array wird nicht genau 30 Elemente auf der dritten Dimension und 1 auf dem zweiten, wie Sie in Ihrem ursprünglichen hatten Code. Nicht sicher, ob das ein Problem für dich sein wird.

Wenn Sie das tun myArray[30][1][0], versucht JavaScript Element für den Zugriff auf 30 im Array myArray, aber da myArray Variable noch nicht zu irgendetwas initialisiert wurde, wird der Wert undefined hat. So Ihr Code entspricht mit:

var myArray; 
myArray[30] = new Date(); 

Dieser Code wird Cannot set property '30' of undefined den Fehler zu erteilen.

Edit: Wenn Sie sicher, dass vor dem Array existiert machen wollen Werte zuweisen und vermeiden vorhandene Werte überschreiben, die eleganteste Art, wie ich denken kann ist:

// Store a value in the array, at index (posX, posY, posZ), only if 
// that position in the array is currently empty 
function storeDateNoOverride(theArray, posX, posY, posZ, date) { 
    var theArray = theArray || []; 
    theArray[posX] = theArray[posX] || []; 
    theArray[posX][posY] = theArray[posX][posY] || []; 
    theArray[posX][posY][posZ] = theArray[posX][posY][posZ] || date; 
} 

// If variable theArray doesn't have a value yet, assign it to a new array 
var theArray = theArray || []; 

storeDateNoOverride(theArray, 30, 1, 0, new Date()); 
+0

Nein, das ist kein Problem, aber mein Problem ist, dass ich zuerst nicht weiß, ob das Variablenarray bereits existiert und zweitens, wenn es bereits einen Wert an der Position gibt, sagen wir, [29] [2] [15 ], die ich nicht überschreiben möchte. – Emilio

+0

@Emilio: Bitte sehen Sie meine Bearbeitung (hinzugefügt Beispielcode, der nach vorhandenen Werten sucht) – AdrianT

+0

Vielen Dank! Das ist großartig! – Emilio

-1

Sie können nicht ein verschachteltes Objekt initialisieren wie Das. Es gibt zwei Möglichkeiten. Wenn Sie Ihre ND-Array-Größe im Voraus kennen, sollten Sie sie zunächst wie folgt instanziieren:

Array.prototype.clone = function(){ 
 
    return this.map(e => Array.isArray(e) ? e.clone() : e); 
 
}; 
 
function arrayND(...n){ 
 
    return n.reduceRight((p,c) => c = (new Array(c)).fill().map(e => Array.isArray(p) ? p.clone() : p)); 
 
} 
 

 
var arr = arrayND(5,5,5,void 0); // create 5x5x5 array and fill each cell with "undefined" 
 
arr[3][2][1] = arr[3][2][1] || new Date(); // if falsey value then insert current date. 
 
console.log(arr);

jedoch, wenn Sie die mehrdimensionale Größe im Voraus nicht wissen, und mögen Ihren Array wachsen dynamisch können Sie eine Funktion wie getNestedValue() und setNestedValue() verwenden. In diesem speziellen Fall werde ich die Object.prototype erweitern. Im Produktionscode sollte dies jedoch über das Tool Object.defineProperty() erfolgen.

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

 
Object.prototype.setNestedValue = function(...a) { 
 
    a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1)) 
 
                     : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]), 
 
                     this[a[0]].setNestedValue(...a.slice(1))) 
 
       : this[a[0]] = a[1]; 
 
    return this; 
 
}; 
 

 
var arr = []; 
 
arr.getNestedValue(30,1,0) || arr.setNestedValue(30,1,0,new Date()); // if exists don't overwrite it; 
 
console.log(arr[30][1][0]);

+0

Vielen Dank! Es sich überlegen! – Emilio

0

Was ist der schnellste Weg, um einen Wert in einem Array an der Position zu speichern, sagen wir mal, [30] [1] [0] ...

der klassische Weg ist

array[30] = array[30] || []; 
array[30][1] = array[30][1] || []; 
array[30][1][0] = array[30][1][0] || []; 
array[30][1][0].push(value); 

oder das Äquivalent in geeigneter Weise pa ralmeterisierte Mode.

Sie könnten einen kleinen Helfer machen:

function subarray(array, n) { 
    return array[n] = array[n] || []; 
} 

Dann könnten Sie schreiben

subarray(subarray(subarray(array, 30), 1), 0).push(value) 

Sie könnten auch die Helfer schreiben alle zugreifenden zu tun und in einer Kontrolle Schlag:

function getNestedElement(array, firstIndex, ...indices) { 
    if (firstIndex === undefined) return array; 
    return getNestedElement(array[firstIndex] = array[firstIndex] || [], ...indices); 
} 

Und dann schreiben

getNestedElement(array, 30, 1, 0).push(value) 
+0

Vielen Dank! Es sich überlegen! – Emilio

Verwandte Themen