2016-12-16 3 views
0

У меня есть массив словарей:Как получить индекс словаря из массива словаря?

var array = [["txt":"5mbps", "value": 2048],["txt":"50mbps", "value": 18048],["txt":"55mbps", "value": 22048]] 

здесь, я хочу, чтобы получить значениеиз этого индекса словарей, которые TXT будет выбран. Если я выберу 50 Мбит/с, как я могу получить этот индекс и показать значение того же индекса. - Свифта

+0

«что индекс словарей», что вы имеете в виду под «индексом»? Дайте нам тестовый ввод/вывод. – Alexander

+0

Возможно, лучше использовать массив кортежей? [(txt: String, value: Int)] –

+0

вы можете мне предложить один пример @Adrian – Aashish

ответ

3

Может быть, лучше использовать массив кортежей

var array: [(txt: String, value: Int)] = [ 
    ("5mbps", 2048), 
    ("50mbps", 18048), 
    ("55mbps", 22048) 
] 

Swift 2,3

array.filter { element in 
    return element.txt == findingText 
}.first?.value 

Свифта 3

array.first { element in 
    return element.txt == findingText 
}?.value 
+0

'array.first {$ 0 [" txt "] as? String == "50mbps"}? ["Value"] '. Немного короче: p – Eendje

+0

@Eendje Да, я знаю :), но мне не нравится писать все в одной строке. Я предпочитаю использовать enther –

+0

в порядке, но можем ли мы выполнить эту задачу, если текст «ключ» неизвестен? – Aashish

1

использование фильтра

func searchValue(txt: String) -> Int? { 

    if let f = (array.filter { $0["txt"] == txt }).first, value = f["value"] as? Int { 
     return value 
    } 
    return nil 
} 

searchValue("5mbps") // 2048 
searchValue("50mbps") // 18048 
searchValue("55mbps") // 22048 
+0

okay , но можем ли мы выполнить эту задачу, если «ключевой» текст неизвестен? – Aashish

+0

Вы имеете в виду, что «txt» может быть чем-то еще? – koropok

+0

Я имел в виду, 5 Мбит/с, 50 ​​Мбит/с, это может измениться. – Aashish

6

получить индекс вы можете использовать:

let index = array.index(where: {$0["txt"] as! String == "5mbps"}) 

или получить значения непосредственного

array.filter({$0["txt"] as! String == "5mbps"}).first 
+0

в порядке, но можем ли мы выполнить эту задачу, если текст «ключа» неизвестен? – Aashish

+0

Это должен быть принятый ответ, а наверху –

0

Если дело непосредственно получить значение из словаря на основе данного индекса (без использования ключа словаря «.txt»):

let givenIndexForArray = 1 

if let value = array[givenIndexForArray]["value"] { 
    print(value) // 18048 
} 

Если случай, чтобы получить значение (ы) на основе ключей словарей, вы можете столкнуться дублирования:

В случае дублирования, что вам нужно, чтобы получить массив значений:

let givenKey = "50mbps" 

let valueArray = array.filter { // [Optional(18048)] 
    // assuming that the key is ALWAYS "txt", or value will be an empty array 
    $0["txt"] == givenKey 
    } 
    .map { 
     // assuming that the value is ALWAYS "value", or value will be an empty array 
     $0["value"] 
} 

Итак, давайте предположим, что ваш массив выглядит следующим образом («50Mbps» ключ дублируется):

var array = [["txt":"5mbps", "value": 2048],["txt":"50mbps", "value": 18048],["txt":"50mbps", "value": 22048]] 

применяя гр ode снизу, выход должен быть: [Дополнительно (18048), опционально (22048)].

Наконец, если дело получить только одно значение (или первой, если есть дублирование) просто, получить .first из одного valueArray массива:

let first = valueArray.first // 18048 
+0

в порядке, но можем ли мы выполнить эту задачу, если текст «ключ» неизвестен? – Aashish

+0

Не могли бы вы привести пример? если ключ не является «txt», выход должен быть nil –

+0

. Я использую «txt» в качестве значения выбора, но мне нужно запросить API с «значением» того же индекса, что и txt. – Aashish

Смежные вопросы