按照嵌套 JSON 值对 Lua 表进行排序

我们在 Redis 中拥有一个键值对,其中键是具有各种信息的 JSON 对象的值;

"node:service:i-01fe0d69c343734" :
"{\"port\":\"32781\",
\"version\":\"3.0.2\",
\"host-instance-id\":\"i-01fe0d69c2243b366\",
\"last-checkin\":\"1492702508\",
\"addr\":\"10.0.0.0\",
\"host-instance-type\":\"m3.large\"}"

是否可能根据值的 last-checkin 时间对表进行排序?

点赞
用户7504558
用户7504558

以下是我使用快速排序算法解决您的问题的解决方案,在对您的输入进行一些更正之前(按照我理解的方式):

-----------------------------------------------------
local json = require(“json”)

function quicksort(t,sortname,start,endi)
  start,endi = start或1,endi或#t
  sortname = sortname或1
  if(endi - start<1)then返回t end
  local pivot = start
  for i = start + 1,endi do
    if  t [i] [sortname] <= t [pivot] [sortname] then
      local temp = t [pivot + 1]
      t [pivot + 1] = t [pivot]
      if(i == pivot + 1)then
        t [pivot] = temp
      else
        t [pivot] = t [i]
        t [i] = temp
      end
      pivot = pivot + 1
    end
  end
  t = quicksort(t,sortname,start,pivot-1)
  return quicksort(t,sortname,pivot +1,endi)
end
---------------------------------------------------------

- 我手动添加了分隔符“,”
- 名称“node:service ...”必须不同
str = [[
{
“node:service:i-01fe0d69c343731”:
“{\" port \”:\“32781\",
\"version\":\"3.0.2\",
\"host-instance-id\":\"i-01fe0d69c2243b366\",
\"last-checkin\":\"1492702506\",
\"addr\":\"10.0.0.0\",
\"host-instance-type\":\"m3.large\"}”
,
“node:service:i-01fe0d69c343732”:
“{\" port \”:\“32781\",
\"version\":\"3.0.2\",
\"host-instance-id\":\"i-01fe0d69c2243b366\",
\"last-checkin\":\"1492702508\",
\"addr\":\"10.0.0.0\",
\"host-instance-type\":\"m3.large\"}”
,
“node:service:i-01fe0d69c343733”:
“{\" port \”:\“32781\",
\"version\":\"3.0.2\",
\"host-instance-id\":\"i-01fe0d69c2243b366\",
\"last-checkin\":\"1492702507\",
\"addr\":\"10.0.0.0\",
\"host-instance-type\":\"m3.large\"}”
,
“node:service:i-01fe0d69c343734”:
“{\" port \”:\“32781\",
\"version\":\"3.0.2\",
\"host-instance-id\":\"i-01fe0d69c2243b366\",
\"last-checkin\":\"1492702501\",
\"addr\":\"10.0.0.0\",
\"host-instance-type\":\"m3.large\"}”
}
]]

- 删除不必要的\
str = str:gsub('“{''{'):gsub('”}''}'):gsub('\\“',“”)

local t_res = json.decode(str)
- 在排序之前准备好表格
local t_indexed = {}
for k,v in pairs(t_res)do
    v [“node-service”] = k
     t_indexed [#t_indexed + 1] = v
end
- 算法quicksort只为索引表实现
local t_sort = quicksort(t_indexed,“last-checkin”)

for k,v in pairs(t_sort)do
     print(k,v [“node-service”],v [“port”],v [“version”],v [“host-instance-id”],v [“last-checkin”],v [“addr”],v [“host-instance-type”])
end

控制台:

1   node:service:i-01fe0d69c343734    32781    3.0.2    i-01fe0d69c2243b366    1492702501    10.0.0.0    m3.large
2   node:service:i-01fe0d69c343731    32781    3.0.2    i-01fe0d69c2243b366    1492702506    10.0.0.0    m3.large
3   node:service:i-01fe0d69c343733    32781    3.0.2    i-01fe0d69c2243b366    1492702507    10.0.0.0    m3.large
4   node:service:i-01fe0d69c343732    32781    3.0.2    i-01fe0d69c2243b366    1492702508    10.0.0.0    m3.large
2017-04-20 18:11:28