如何过滤数组以对应其他数组

时间:2017-02-20 16:28:43

标签: arrays swift filtering

我有两个阵列:

var filteredTitles = [String]()
var filteredTypes = [String]()

我将第一个数组过滤为使用搜索栏的一部分。元素的顺序可能会完全改变。但是,我无法像第一个数组那样过滤第二个数组,因为我不想在搜索时将其用于计数。但我希望第二个数组与第一个数组的顺序相同。所以,回顾一下。如何通过索引过滤数组以匹配另一个数组?

一个例子:

var filteredArray = ["One", "Two", "Three"]
//Sort the below array to ["1", "2", "3"], the order of the upper array
var toBeFilteredArray = ["2", "1", "3"]

不使用字母或数字顺序,因为在这种情况下不会这样做。

编辑: 拉塞尔: 如何对这样的标题进行排序:

// When there is no text, filteredData is the same as the original data
    // When user has entered text into the search box
    // Use the filter method to iterate over all items in the data array
    // For each item, return true if the item should be included and false if the
    // item should NOT be included
    searchActive = true
    filteredData = searchText.isEmpty ? original : original.filter({(dataString: String) -> Bool in
        // If dataItem matches the searchText, return true to include it
        return dataString.range(of: searchText, options: .caseInsensitive) != nil
    })

2 个答案:

答案 0 :(得分:4)

没有两个数组 - 拥有一个自定义类型的数组,包含您需要的两个变量

定义你的结构

struct MyCustomData
{
    var dataTitle   : String = ""
    var dataType    : String = ""
}

然后宣布

var dataArray : [MyCustomData] = []

填充它并在需要的地方对其进行排序 - 我以相反的顺序填充,以便我们可以看到它被排序

dataArray.append(MyCustomData(dataTitle: "Third", dataType: "3"))
dataArray.append(MyCustomData(dataTitle: "Second", dataType: "2"))    
dataArray.append(MyCustomData(dataTitle: "First", dataType: "1"))

let filteredArray = dataArray.sorted {$0.dataTitle < $1.dataTitle}
for filteredElement in filteredArray
{
    print("\(filteredElement.dataTitle), \(filteredElement.dataType)")
}
// or, to print a specific entry
print("\(filteredArray[0].dataTitle), \(filteredArray[0].dataType)")

答案 1 :(得分:0)

使用zip保持两个独立数组同步的示例:

let titles = ["title1", "title3", "title4", "title2"]
let types = ["typeA", "typeB", "typeC", "typeD"]

let zipped = zip(titles, types)

// prints [("title4", "typeC"), ("title2", "typeD")]
print(zipped.filter { Int(String($0.0.characters.last!))! % 2 == 0 })

您可以对过滤后的结果使用map,以获取标题和类型的两个单独的过滤数组。