2017-02-28 35 views
-2

Ich spiele gerade mit nodeJs und habe versucht, neue Daten in eine bestehende JSON-Datei zu schreiben, nur um Probleme mit dem Format zu haben und die richtigen Daten zu bekommen um dieses neue JSON-Objekt zum ersten der Array-Liste zu bekommen. Ich habe das getan, indem ich die erste Index-ID genommen habe, sie erhöht habe und versucht habe, unshift() zu verwenden, aber es fügt nicht so hinzu, wie ich es erwartet hatte.Hinzufügen eines neuen JSON-Objekts vor dem JSON-Array-Set

JSON-Datei Inhalt data.json:

[ 
    { 
     "id": 3, 
     "content": "three" 
    }, 
    { 
     "id": 2, 
     "content": "two" 
    }, 
    { 
     "id": 1, 
    "content": "one" 
    } 
] 

Code I für neue JSON obj geschrieben möchte ich hinzufügen:

var allJSON = fs.readFileSync('data.json'); 
var allj = JSON.parse(allJSON); 
var lastId = parseInt(allj[0].id); 
var newData = { 
     id: ++lastId, 
     content: "test" 
    }; 

var allNewJSON = allj.unshift(JSON.stringify(newData)); 
// this yields a result of just the number "4" and erased everything else. 
+1

Lesen Sie die Dokumentation für die Unshift hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift –

+4

Ich stimme für das Schließen dieser Frage als Off-Thema weil die Antwort in der feinen Anleitung gefunden werden kann ~ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift#Return_value – Phil

+2

Auch abgesehen von dem Problem mit dem Wert zurückgegeben aus '.unshift()', warum rufen Sie 'JSON.stringify()' auf dem Element auf, das Sie dem Array hinzufügen möchten? Die Elemente in Ihrem Array sind keine JSON-Zeichenfolgen. – nnnnnn

Antwort

1

Ihr Ergebnis ist aufgrund der Art und Weise unshift funktioniert.

unshift ist eine Funktion, die die Länge des aktualisierten Arrays zurückgibt.

Zum Beispiel

> const a = [10, 20, 30]; 
> a.unshift(5); 
4 

Das ist richtig, der Aufruf von unshiftkehrt 4, weil die aktualisierte Array 4 Elemente.

Lasst uns den aktualisierten Wert von a sehen:

> a 
[5, 10, 20, 30] 
+2

Ich fühle mich wie mit dem Begriff * "neues Array" * ist falsch. Es ist immer noch das gleiche alte Array, nur größer – Phil

+0

Sie haben absolut Recht, danke! Es ist gut, in diesem Fall darauf hinzuweisen. Ich habe die Antwort modifiziert. –

1

Array#unshift kein neues Array erstellen und zurück; Stattdessen ändert es das ursprüngliche Array und gibt seine neue Länge zurück. In Ihrem Fall wäre dieser Wert 4. Ich würde vorschlagen, den Rückgabewert von unshift zu ignorieren und einfach Ihren Code weiterhin die allj Variable, etwa so:

var allJSON = fs.readFileSync('data.json'); 
var allj = JSON.parse(allJSON); 
var lastId = parseInt(allj[0].id); 
var newData = { 
     id: ++lastId, 
     content: "test" 
    }; 

allj.unshift(newData); 
console.log(allj) // modified as desired! 

Edit: Wie in den Kommentaren oben erwähnt wurde, werden Sie wahrscheinlich nicht wollen, rufen werden JSON.stringify auf das Objekt newData bevor Sie es in Ihr Array einfügen. An dieser Stelle möchten Sie lieber mit JS-Objekten als mit JSON-Strings arbeiten.

Verwandte Themen