Multi column sort

Table.sort works just fine if you want to sort a simple table. But there have been times where I wanted to sort more complex tables on different columns. Here’s some code that shows examples of sorting on 2 different type tables on multiple columns. If you uncomment the mySort at the end of the setup() function, you’ll see the alert error message for no columns passes to mySort.

-- sort by column position

function setup()    
    tab1={}
    table.insert(tab1,{12,56,38})
    table.insert(tab1,{34,32,12})
    table.insert(tab1,{12,56,18})
    table.insert(tab1,{12,76,62})
    table.insert(tab1,{12,56,33})
    table.insert(tab1,{76,27,56})
    table.insert(tab1,{17,58,31})
    table.insert(tab1,{12,16,43})
    table.insert(tab1,{12,56,78})
    
    mySort(tab1,{2,3})   -- sort tab1 on column 2 then 3.
    
    print("sort columns 2, 3")
    for a,b in pairs(tab1) do    -- print the sorted table
        print(b[1],b[2],b[3])
    end
    
    tab2={}
    table.insert(tab2,{c1=12,c2=16,c3=36})
    table.insert(tab2,{c1=34,c2=32,c3=12})
    table.insert(tab2,{c1=12,c2=56,c3=18})
    table.insert(tab2,{c1=12,c2=76,c3=36})
    table.insert(tab2,{c1=12,c2=56,c3=36})
    table.insert(tab2,{c1=76,c2=27,c3=56})
    table.insert(tab2,{c1=17,c2=58,c3=31})
    table.insert(tab2,{c1=12,c2=16,c3=43})
    table.insert(tab2,{c1=12,c2=56,c3=78})
       
    mySort(tab2,{"c1","c3","c2"})   -- sort tab2 on c1, then c3, then c2.
    
    print("sort columns 1, 3, 2")
    for a,b in pairs(tab2) do    -- print the sorted table
        print(b.c1,b.c2,b.c3)
    end
    
    —mySort(tab2)   -- causes error
end

function mySort(...)
    tbl,pos=...
    if pos==nil then
        viewer.alert("No column passed to sort function.")
    else
        table.sort(tbl,
        function(a,b)
            for z=1,#pos do
                if a[pos[z]]<b[pos[z]] then
                    return true
                elseif a[pos[z]]>b[pos[z]] then
                    return false 
                end
            end
        end)
    end
end

Neat!