2015-02-18 3 views
3

У меня есть следующий код, который должен вернуть мне отсортированный массив на основе его значения «pos».Значение сортировки ассоциативного массива

local tables = {} 

table.insert(tables,{ ['pos']=2, ['name'] = 'C' }) 
table.insert(tables, {['pos']=1, ['name'] = 'A' }) 
table.insert(tables,{ ['pos']=30, ['name'] = 'D'}) 


function comp(w1,w2) 
    if tonumber(w1['pos']) > tonumber(w2['pos']) then 
     return true 
    end 
end 

table.sort(tables, comp) 

for key,val in pairs(tables) do 
    print(val['name']) 
end 

Результат:

Д С

Ожидаемое (в алфавитном порядке его "поз"):

A, C, D

Что неправильно?

ответ

4

Из документации table.sort(table [, comp]) в PIL:

[Comp] Эта функция порядка принимает два аргумента и возвращать истину, если первый аргумент должен прийти первым в отсортированном массиве

так замените эту функцию на:

function comp(w1,w2) 
    return w1['pos'] < w2['pos'] 
end 

примечание tonumber, и здесь оба здесь не нужны.

, как @lhf отметил, это можно сделать еще проще:

table.sort(tables, function(w1, w2) return w1.pos < w2.pos end) 
+2

Кроме того, это более простой синтаксис работает: 'w1.pos lhf

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