2017-02-20 18 views
0

Я два массива:Как отфильтровать массив, чтобы соответствовать другому массиву

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

Я отфильтровывать первый массив в качестве части использования SearchBar. Порядок элементов может полностью измениться. Тем не менее, я не могу отфильтровать второй массив так же, как и первый, потому что я не хочу принимать его во внимание при поиске. Но я бы хотел, чтобы второй массив находился в том же порядке, что и первый. Итак, повторю. Как я могу фильтровать массив, чтобы он соответствовал другому по индексам?

Пример:

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

без использования алфавитного или числовой порядок, так что не будет делать в этом случае.

EDIT: Рассел: Как сортировать названия, как это:

// 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 
    }) 

ответ

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)") 
+0

Что сказал Рассел. (проголосовали.) Пытаясь сохранить 2 массива в синхронизации, бесполезно сложна. Просто иметь единственный массив, который содержит все необходимые вам поля, и фильтровать/сортировать этот единственный массив. –

+0

Как я могу получить доступ к одной строке, например, «1»? – Tuomax

+0

Я обновил ответ, чтобы показать, как вы обращаетесь к отдельным полям – Russell

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 для отфильтрованного результата, чтобы вернуть два отдельных фильтрованных массива для названий и типов.