(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Locked
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by Xerox »

Приветствую, следующий вопрос по LUA:
Как наиболее изящно трансформировать sequential table (array) в key-value?
(надеюсь что использую терминологию правильно)
Или превратить массив в что-то параметризированное?
Иными словами, "скрестить" обе таблицы?
Кода такой:
  1. local tbl_seq = {123, 111, 222, 333}
  2.  
  3. local tbl_key = {Type, X, Y, Z}
  4.  
  5. -- а хотим получить вот что:
  6.  
  7. local tbl_res = {Type = 123, X = 111, Y = 222, Z = 333}
Last edited by Xerox on Sat 07 Dec, 2019 16:28, edited 2 times in total.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by John Doe »

Изящно - наверно можно использовать какую-нибудь стороннюю библиотеку с уклоном в функциональное программирование.
Но лучше по-простому.

P.S.
И вы промахнулись разделом.
Last edited by John Doe on Sat 07 Dec, 2019 18:05, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by buniak_a_h »

Xerox, я использую такое:
(приведённый код не теряет "именные" поля и поля, для которых не указан ключ)
  1. local function reCode(aKeys, Src, packed)
  2.  
  3.  local res={}
  4.  
  5.  local i,v = next(Src)
  6.  
  7.  while i do
  8.  
  9.   if type(i) == 'number' and i >= 1 and i <= #aKeys then
  10.  
  11.    res[aKeys[i]] = v
  12.  
  13.   elseif type(i) ~= 'number' or not packed then
  14.  
  15.    res[i] = v
  16.  
  17.   end
  18.  
  19.   i,v = next(Src, i)
  20.  
  21.  end
  22.  
  23.  if packed then
  24.  
  25.   i,v = next(Src)
  26.  
  27.   while i do
  28.  
  29.    if (type(i) == 'number') and (i < 1 or i > #aKeys) then
  30.  
  31.     table.insert(res, v)
  32.  
  33.    end
  34.  
  35.    i,v = next(Src, i)
  36.  
  37.   end
  38.  
  39.  end
  40.  
  41.  return res
  42.  
  43. end -- reCode
  44.  
  45. --------- Примеры
  46.  
  47. local tblKeys={'Value1', 'Value2', 'Value3'}
  48.  
  49. local Src={111, 'Val2', 'Val3', 'iVal4', 'iVal5', Ext1='ValExt1', Ext2='ValExt2'}
  50.  
  51. res1 = reCode(tblKeys, Src) -- не "упакованный" - лишние номерные элементы сохраняют свои номера. Чем плохо: #res1 = 0, по ipairs эти элементы будут недоступны.
  52.  
  53. res2 = reCode(tblKeys, Src, true) -- "упакованный" - лишние номерные элементы будут помещены в res2 подряд, начиная с первого номера
  54.  
  55. return  res1, res2
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by Xerox »

John Doe wrote: Sat 07 Dec, 2019 18:04 И вы промахнулись разделом.
И куда мне надо было?
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by buniak_a_h »

Xerox wrote: Sat 07 Dec, 2019 19:47 И куда мне надо было?
Макросы и скрипты -> Нужна помощь
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by zg »

lua:

Code: Select all

local tbl_res = {}
for k, v in pairs(tbl_key) do tbl_res[v]=tbl_seq[k] end
moonscript: tbl_res = {v,tbl_seq[k] for k,v in pairs tbl_key}
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by Xerox »

zg, спасибо.
в Муне получается что красивше.
А я надеялсся что в ЛУА будет что-то подбное, но не ..
John Doe wrote: Sat 07 Dec, 2019 18:04 И вы промахнулись разделом.
Простите меня дяденька, я больше так не буду
(испуганно вздрагиваeт, и пытается скрыть слезы)
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by zg »

Xerox wrote: Sat 07 Dec, 2019 21:57в Муне получается что красивше.
мунскрипт и есть переосмысление lua в плане более чистого синтаксиса.
User avatar
Xerox
Posts: 395
Joined: Sun 20 Oct, 2019 15:50
Has thanked: 354 times
Been thanked: 9 times

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by Xerox »

Last edited by HaRT on Sun 08 Dec, 2019 23:47, edited 1 time in total.
Reason: Спрятан офтопик
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by zg »

Xerox wrote: Sat 07 Dec, 2019 22:36интересно было бы посмотреть содержательную статью,
откуда вообще взялся этот Мун Скрипт на ФАРе,
и что из себя представляет.
всё происходило в рамках форума. первое сообщение не оригинальное, но оригинальное полностью процитировано во втором.
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

(LUA) Наиболее изящно трансформировать sequential table (array) в key-value?

Post by HaRT »

 ! Message from: HaRT
buniak_a_h wrote: Sat 07 Dec, 2019 20:05
Xerox wrote: Sat 07 Dec, 2019 19:47 И куда мне надо было?
Макросы и скрипты -> Нужна помощь
Я перенёс.
И заодно закрыл тему, что остановить офтопик со стороны нашего любителя валить всё в кучу.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Locked

Return to “Нужна помощь”