2017-02-18 5 views
-3

Swift 3:
Я два массива, один массив словаря (JSON), а другое имеет индексы (значение Int) индекс Path (Collection тип Индекс с номером элемента & раздел). С помощью строк индекса второго массива мне нужно удалить элементы из первого массива.
Swift 3 массива - удалить несколько элементов с помощью другого массива

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

Теперь Второй массив (чтобы удалить из первого массива)

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

Как я могу это сделать? Я хочу полученный массив как

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

ответ

3

Вашего массив arrayIndex это выглядеть как массив Int не массив IndexPath.

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

arrayIndex Если это массив IndexPath затем использовать row свойство, чтобы удалить объект из массива.

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

Так как удаление элемента из массива будет влиять на индексы элементов после этого, вы должны убедиться, что массив индексов для удаления сортируются в порядке убывания – Paulw11

+0

@ Paulw11 Совсем забыл, что, спасибо за предложение. –

2

Вот функциональный подход с использованием enumerated, filter, contains и map для создания массива:

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"]] 

Объяснение:

  • .enumerated() принимает исходный массив и создает массив кортежей пара, содержащий индекс каждый элемента в паре с пунктом: (index, item)
  • filter выбирает те элементы из результирующего массива, которые возвращают true от прошедшего (завершающих) закрытие. В этом случае элемент выбран, если индекс не в arrayIndex
  • map используется, чтобы вытащить только item из полученного массива кортежей
  • индекс был увеличен на 1, потому что ваш пример, казалось, показывают, что ваш arrayIndex начались в 1 и не 0
Смежные вопросы