2017-02-18 5 views
-3

Swift 3 mehr Elemente mit Hilfe von anderen Array entfernen:
Ich habe zwei Arrays, ist ein Array von Wörterbuch (json) und einer anderen ist von Indizes (Wert Int) von Index-Pfad (Sammlung Typ Index mit Elementreihe & Abschnitt). Mit Hilfe der Indexzeilen des zweiten Arrays muss ich Elemente aus dem ersten Array entfernen.
Swift 3-Array

var arrayString = [ // Array with Json elements 
    { "name" : "A" }, 
    { "name" : "B" }, 
    { "name" : "C" }, 
    { "name" : "D" }, 
    { "name" : "E" }, 
    { "name" : "F" }, 
    { "name" : "G" }, 
    { "name" : "H" } 
] 

Jetzt Zweite Reihe (von der ersten Reihe entfernt werden)

var arrayIndex = [ 2, 3, 5 ] // Array with 

Wie kann ich das tun? Ich möchte resultierende Array wie

var arrayString = [ 
     { "name" : "A" }, 
     { "name" : "D" }, 
     { "name" : "F" }, 
     { "name" : "G" }, 
     { "name" : "H" } 
    ] 

Antwort

3

Ihr Array ist arrayIndex aussehen Array von Int nicht Array von IndexPath.

arrayIndex.sorted(by: >).forEach { if $0 < self.arrayString.count { self.arrayString.remove(at: $0) } } 

Wenn arrayIndex Array von IndexPath dann row Eigenschaft verwenden, um das Objekt aus dem Array zu entfernen.

arrayIndex.sorted(by: { $0.row > $1.row }).forEach { if $0.row < self.arrayString.count { self.arrayString.remove(at: $0.row) } } 
+0

Da ein Element aus dem Array entfernt werden die Indizes der Elemente, nachdem sie beeinflussen, sollten Sie sicherstellen, dass vollständig in das Array von Indizes zu entfernen sortiert absteigend – Paulw11

+0

@ Paulw11 vergessen, dass, Danke für den Vorschlag. –

2

Hier ist ein funktionaler Ansatz enumerated, filter, contains und map das Array zu erstellen:

var arrayString = [ 
    [ "name" : "A" ], 
    [ "name" : "B" ], 
    [ "name" : "C" ], 
    [ "name" : "D" ], 
    [ "name" : "E" ], 
    [ "name" : "F" ], 
    [ "name" : "G" ], 
    [ "name" : "H" ] 
] 

let arrayIndex = [2, 3, 5] 

arrayString = arrayString.enumerated() 
    .filter { !arrayIndex.contains($0.0 + 1) } 
    .map { $0.1 } 

print(arrayString) 
[["name": "A"], ["name": "D"], ["name": "F"], ["name": "G"], ["name": "H"]] 

Erläuterung:

  • .enumerated() nimmt die ursprüngliche Anordnung und erzeugt ein Array von Tupels Paare den Index jedes Element enthält, mit dem Element gepaart: (index, item)
  • filter wählt diese Elemente aus dem resultierenden Array, das true aus dem übergebenen (nachlaufRück) Verschluss. In diesem Fall wird ein Element ausgewählt, wenn sein Index wird nur die item aus dem resultierenden Array von Tupeln
  • der Index um 1 erhöht zog nicht in arrayIndex
  • map verwendet, weil Ihr Beispiel, dass Ihre arrayIndex anzuzeigen schien bei 1 gestartet und nicht 0