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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Locked
User avatar
Xerox
Posts: 393
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. local tbl_key = {Type, X, Y, Z}
  3. -- а хотим получить вот что:
  4. 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: 12897
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 296 times

(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.
buniak_a_h
Posts: 2131
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 times
Contact:

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

Post by buniak_a_h »

Xerox, я использую такое:
(приведённый код не теряет "именные" поля и поля, для которых не указан ключ)
  1. local function reCode(aKeys, Src, packed)
  2.  local res={}
  3.  local i,v = next(Src)
  4.  while i do
  5.   if type(i) == 'number' and i >= 1 and i <= #aKeys then
  6.    res[aKeys[i]] = v
  7.   elseif type(i) ~= 'number' or not packed then
  8.    res[i] = v
  9.   end
  10.   i,v = next(Src, i)
  11.  end
  12.  if packed then
  13.   i,v = next(Src)
  14.   while i do
  15.    if (type(i) == 'number') and (i < 1 or i > #aKeys) then
  16.     table.insert(res, v)
  17.    end
  18.    i,v = next(Src, i)
  19.   end
  20.  end
  21.  return res
  22. end -- reCode
  23. --------- Примеры
  24. local tblKeys={'Value1', 'Value2', 'Value3'}
  25. local Src={111, 'Val2', 'Val3', 'iVal4', 'iVal5', Ext1='ValExt1', Ext2='ValExt2'}
  26. res1 = reCode(tblKeys, Src) -- не "упакованный" - лишние номерные элементы сохраняют свои номера. Чем плохо: #res1 = 0, по ipairs эти элементы будут недоступны.
  27. res2 = reCode(tblKeys, Src, true) -- "упакованный" - лишние номерные элементы будут помещены в res2 подряд, начиная с первого номера
  28. return  res1, res2
User avatar
Xerox
Posts: 393
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 И вы промахнулись разделом.
И куда мне надо было?
buniak_a_h
Posts: 2131
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 131 times
Been thanked: 211 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: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 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: 393
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: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

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

Post by zg »

Xerox wrote: Sat 07 Dec, 2019 21:57в Муне получается что красивше.
мунскрипт и есть переосмысление lua в плане более чистого синтаксиса.
User avatar
Xerox
Posts: 393
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: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

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

Post by zg »

Xerox wrote: Sat 07 Dec, 2019 22:36интересно было бы посмотреть содержательную статью,
откуда вообще взялся этот Мун Скрипт на ФАРе,
и что из себя представляет.
всё происходило в рамках форума. первое сообщение не оригинальное, но оригинальное полностью процитировано во втором.
User avatar
HaRT
Moderator
Posts: 9601
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 114 times
Been thanked: 233 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 “Нужна помощь”