2017-09-29 1 views
0

Ich versuche, eine API in node.js zu erstellen, die zwei verschiedene Systeme synchronisiert, und ich habe Probleme beim Zerlegen eines Array von Objekten, die ich von meinem Quellsystem erhalten. Grundsätzlich , erhalte ich ein Array, das ein bisschen wie folgt aussieht:Wie kann ich Elemente aus einem JSON-Array basierend auf einer Liste von Array-Schlüsseln entfernen?

sourcedata = { 
     "items": [ 
      { "id": "item1", 
      "some fields": {...array of some fields }, 
      "more fields": {another block of fields} 
      }, 
     { "id": "item2", 
     "some fields": {...array of some fields }, 
     "more fields": {another block of fields} 
       }] 
    } 

Was ich auch drei Arrays von IDs haben - neue (bedeutet, dass ich sie auf das Zielsystem senden), alte (zu Löschen aus dem Ziel), und diejenigen, die auf beiden erscheinen - diejenigen, die ich ein spezielles Tag überprüfen muss, um zu sehen, ob sie unterschiedlich sind oder nicht.

z.B.

newitems = [id1,id2,id3] 
existingItems [id4,id5,id6] 
deletedItems = [id7,id8] 

Was ich versuche neue Arrays zu tun ist, erstellen, die nur die Daten des NEW enthält und vorhandene Elemente, so kann ich verarbeiten und schicken sie ohne für jede der Source-Array-Abtastung auf das Zielsystem über Schlüssel und Entscheidung, was zu tun ist. Ich weiß, wie man das macht, wenn ich einfache Arrays vergleiche, aber hier müssen die gesamten Objekte und alle ihre Felder kopiert werden, und ich kann nicht den richtigen Weg finden, es zu tun. Jede Hilfe wäre willkommen.

Antwort

0

Sie können die filter Funktion verwenden. Es filtert basierend auf Ihrer Bedingung Elemente des Arrays heraus. Sie können es mit der includes Funktion verwenden, um festzustellen, ob sich ein Ding in einem Array befindet. Zum Beispiel:

sourceArray = [ 
    { 
    id: 'a' 
    }, 
    { 
    id: 'b' 
    }, 
    { 
    id: 'c' 
    }, 
    { 
    id: 'd' 
    } 
] 

var toDelete = ['c', 'b'] 

sourceArray = sourceArray.filter(x => !toDelete.includes(x.id)) 
// some items in sourceArray have now been removed. 

Beachten Sie, dass filter und includes kann eine aktuelle Version von NodeJS erfordern.

+0

Ich schaffte es, das vorher zu tun, aber immer noch nicht sicher, wie ich es auf mein komplexeres Array anwenden soll, und ich suche nach den effizientesten Möglichkeiten, die neuen und vorhandenen Elemente vom Hauptarray zu trennen. Um Objekte vom Zielsystem zu löschen, brauche ich nur die ID, aber um Updates zu senden, brauche ich den gesamten Datensatz. – NadavM

+0

@ user3541347 Diese Methode sollte für alle Arrays funktionieren. Was für eine spezielle Anforderung haben Sie, die Sie glauben lässt, dass es für "komplexe" Arrays nicht funktioniert? – maowtm

+0

Mein Fehler - ich habe vergessen, das Array zu referenzieren - im Grunde hat meine ursprüngliche Variable das Array in einem Container, also musste ich einfach auf das richtige verweisen. Funktioniert wie ein Charme! – NadavM

Verwandte Themen