2017-02-18 67 views
-3

夫特3:
我有兩個陣列,一個是字典(JSON)的陣列,並且另一個是索引路徑索引(int值)的(集合類型索引與元素行&部分)。藉助第二個數組的索引行,我需要從第一個數組中刪除元素。
夫特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) } } 

如果arrayIndexIndexPath陣列然後使用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完全忘記了排序, thanx的建議。 –

2

下面是使用enumeratedfiltercontains,和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選擇了一個項目,如果它的指數是不是在arrayIndex
  • map用於從產生的元組
  • 指數增加了1的陣列拉只是item1開始,而不是0