چگونگی مرتب کردن map در حلقه for در الکسیر

با درود خدمت شما . فرض بفرمایید بنده یک map دارم به این صورت

menu = %{
            home: {"خدمات", "/", [
                {"ops1", "/sup1"}, {"test1", "/sup2"}, {"test2", "/sup3"}
              ]},
            blog: {"بلاگ", "/blog", [
                {"ops2", "/sup1"}, {"test3", "/sup2"}, {"test4", "/sup3"}
              ]},
            about: {"درباره ما", "/about", [
              ]},
            contact: {"ارتباط با ما", "/contact", [
                {"ops3", "/sup1"}, {"test5", "/sup2"}, {"test6", "/sup3"}
              ]}
          }

و حلقه من به این صورت است

for {_key, {name, addres, sub}} <- menu do 

اگر اینجوری بخوام فرخوانی کنم مشخص نیست اصلا داره چیجوری خودش مرتب می کنه در صورتی که من می خوام از شماره بالا به پایین خودش بیاره نه اینکه در هم بیاره

در صورتی که من اگر بیام به این صورت بنویسم

menu = %{
            a_home: {"خدمات", "/", [
                {"ops1", "/sup1"}, {"test1", "/sup2"}, {"test2", "/sup3"}
              ]},
            b_blog: {"بلاگ", "/blog", [
                {"ops2", "/sup1"}, {"test3", "/sup2"}, {"test4", "/sup3"}
              ]},
            c_about: {"درباره ما", "/about", [
              ]},
            d_contact: {"ارتباط با ما", "/contact", [
                {"ops3", "/sup1"}, {"test5", "/sup2"}, {"test6", "/sup3"}
              ]}
          }

بر اساس حرف از a شروع می کنه تا d می یاد . چطور می شه این مورد رو بدون اضافه کردن حرف اول هر بخش سورت کرد به صورتی که اول home و به ترتیب تا contact نمایش داده شود ؟

با تشکر

Enum.map استفاده کن

1 پسندیده

سام عزیز دقیقا چطور باید استفاده کنم من خیلی کد دیدم مثلا Enum.sort نتونستم استفاده کنم یا ارور نمی ده تاثیر نداره یا کلا ارور داره کجای for باید بزارم ؟

بجای for از map استفاده کن برای کاره حلقه ای

Enum.map(menu, my_function)
1 پسندیده

سام عزیز چون در html دارم می نویسم از اینجور استفاده کنم متاسفانه بلد نیستم بینش اچتی ام ال بزارم

/templates/layout/_navigation.html.eex

به عنوان مثال برای for به این صورت اقدام می کنم

for {_key, {name, addres, sub}} <- Enum.sort(menu) do %>
          <%=if length(sub) > 0 do %>
              <%=if addres === @conn.request_path do
                tag(:li, class: "nav-item dropdown active")
              else
                tag(:li, class: "nav-item dropdown")
              end %>
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <%= name %>
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <%= for {subname, subaddres}  <- sub do
                raw "<a class=\"dropdown-item\" href=#{subaddres}>#{subname}</a><div class=\"dropdown-divider\"></div>"
              end %>
              </div>
            </li>
          <% else %>
          <%=
            if addres === @conn.request_path do
              tag(:li, class: "nav-item active")
            else
              tag(:li, class: "nav-item")
            end
          %>
              <%= raw "<a class=\"nav-link\" href=#{addres}>#{name}</a>" %>
          </li>
          <% end %>
        <% end %>

ولی نمی تونم

  <%= Enum.map(menu, fn({_key, {name, addres, sub}}) ->
      "hellow"
      end) |> Enum.sort %>

رو مثال بالا در بیارم بخاطر پرانتز Enum.map

اگه اول میخای sort بشه همین کافیه

Enum.sort(menu)

بعد میگم بجای for که بالا داری با map یا each
تمپلت درست کن

Enum.sort(menu) |> Enum.each(function_that_outputs_template)

اینجا رو بخون
https://hexdocs.pm/phoenix/templates.html

1 پسندیده

ممنون سام عزیز من این مطلب اول خوندم فایده ای نداشت یعنی متوجه نشدم یک چند باری خوندم و دیدم که داره ساختار خود فونیکس رو توضیح می ده و دیدم داره چیکار می کنه . یک چندتا چیز دیگه ای نیاز داشتم هم توش بود یاد گرفتم ولی …

شما گفتید من بیام همون تمپلیتی که درست کردم رو تو each بیارم مثل زیر

Enum.sort(menu) |> Enum.each(function_that_outputs_template)

این کد در تمپلیت من هست, شما این فانکشن رو از کجا دارید لود می کنید ‍function_that_outputs_template از توی view ؟ از کجا دقیقا داره لود می شه. مشکل اصلی من در این اینکه من در veiw اگر بیارم کد های اچ تی ام ال رو چیجوری بیارم توش ؟ چون یک بخشی از اونا که زیاده خام آورده می شه نه raw نه tag در داخلش استفاده نمی شه مثل

نمونه کد بالا

این بخش مشکل من شده که html رو چیجوری بیارم توش

بخوام با مثال بگم من حتی می خوام این کارو بکنم ارور دارم


<%= Enum.sort(menu) |> Enum.each( %>
  <div class="dropdown-menu" aria-labelledby="navbarDropdown">
    DEV
  </div>
<% ) %>

احتمالا دارم جاشو اشتباه می بنیم مخصوصا فراخوانی function_that_outputs_template


به روز رسانی

فکر می کنم مشکل اون بالا رو متوجه شدم البته بجز اینکه شما دارید فانکشن تمپلیت از کجا می خونید

ولی چون Enum.each خروجی مثل اینکه نداره ارور می ده

کد تغییر بدیم به این

<%= Enum.map(menu, fn {_key, {name, address, sub}} -> %>
  <div class="basket"></div>
  <div class="container"></div>
<% end) %>

می شه اینجوری کد زد البته هنوز مشکل sort کردنم بر اساس key حل نشده . چرا بر اساس حرف داره سورت می کنه و نمی یاد بر اساس کلید و جایگاهش سورت نمی کنه خودش جالب به توجه است.

اون مشکل مرتب کردن هم حل کردم از لیست استفاده کردم. فقط می مونه ‍function_that_outputs_template

نمونه لیست

menu = [
      home: {"خدمات", "/", [
          {"ops1", "/sup1"}, {"test1", "/sup2"}, {"test2", "/sup3"}
        ]},
      blog: {"بلاگ", "/blog", [
          {"ops2", "/sup1"}, {"test3", "/sup2"}, {"test4", "/sup3"}
        ]},
      about: {"درباره ما", "/about", [
        ]},
      contact: {"ارتباط با ما", "/contact", [

        ]}
    ]

نمیتونی قبل اینکه menu به فایل view بدی با Enum.sort
مرتب کنی بعد بفرستی؟
من چند ساعت دیگه کد شو مینویسم

defmodule MenuMappings do
  def fetch_menu do
    [
      home: {"خدمات", "/", [
          {"ops1", "/sup1"}, {"test1", "/sup2"}, {"test2", "/sup3"}
        ]},
      blog: {"بلاگ", "/blog", [
          {"ops2", "/sup1"}, {"test3", "/sup2"}, {"test4", "/sup3"}
        ]},
      about: {"درباره ما", "/about", [
        ]},
      contact: {"ارتباط با ما", "/contact", [

        ]}
    ] |> Enum.sort
  end
end



<%= Enum.map(MenuMappings.fetch_menu, fn {_key, {name, address, sub}} -> %>
  <div class="basket"></div>
  <div class="container"></div>
<% end) %>

این باید کار کنه اما اگه میخواهی هر سری sort نکنی چرا menu
sort شده از اول نمینویسی

1 پسندیده

درود سام عزیز . ممنون لطف کردی و وقت گذاشتی .

سام عزیز مشکل در map هست الانکه شما اومدید و به صورت لیست فراخوانی کردید دیگه مشکلی نیست . من فکر می کنم مپ هست که سورت نمی شه چون منم در کد بالا خدمتتون دادم مثل شما عمل کردم . البته کار من با قطعه کد شما و همینطور کد بالاتر حل شد و ممنون بخاطر اون پستی که لینک دادید

راستی در مورد فانکشن که کد قرار دادید چون منو های بنده درهمه صفحات تکراری هست من در view که بین همه شیر هست قرار دادم

بازم ممنون چند مشکل کلیدی بنده رو حل کردید

1 پسندیده

خواهش میکنم بله map ساختارش ترتیب رعایت نمیکنه
مگه sorted map باشه که فکر نمیکنم الیکسیر داشته باشه
لیست ولی باید کارت راه بندازه

1 پسندیده

من پست ها رو نخوندم, اما وقتی صفحه رو بالا پایین کردم دیدم که توی تمپلت sort و احتمالا logic های دیگه وجود داره, دیتا نباید در تمپلت ساخته بشه, از helper استفاده کن

1 پسندیده

درود توماج جان دیتا داخل تمپلیت درست نشده . چون منو ثابت هست و یک لیست کوچیکه و باز باید در تمام صفحات شیر بشه تصمیم گرفتم اون رو در

trangell_html_site_web/views/layout_view.ex

به نظرم بهترین جا هست برای این کار . این view روی همه تمپلیت ها شیر می شه

1 پسندیده

از نظر من وقتی sort بکار رفته یعنی شده🤞
خار از شوخی، منظور من در مورد sort و هر چیز دیگری بود که در دیتا تغییر ایجاد کنه یا دیتا تولید کنه و در کل منطق باشه.
چون بحث مربوط به فانکشنال پروگرمینگ بود و نمی خواستم در مورد واژه تغییر دیتا بازخواست بشم، گفتم ساخته شدن دیتا که راستش خیلی هم غلط نیست😉

1 پسندیده

توماج جان من اصلا اومدم تو این انجمن که یاد بگیریم به خدا :joy: صحبت می کنیم که اگر اشتباهی بود بهمون بگند

در مورد sort شدن باید بگم که من از توابع مرتب سازی اصلا استفاده نکردم وقتی اومدم از خود لیست به جای مپ استفاده کردم خودش مرتب شده بود و دیگه نیاز من براورده شد . با اینکه تابع مرتب سازی رو هم زدم دیدم تفاوتی نکرد بی خیال شدم و اون قسمت مرتب سازی رو پاک کردم .

1 پسندیده

گفتم که من اصلا پست ها رو نخوندم، فقط یه لحظه چشمم به چنتا مورد خورد. بازم ممنون که پاسخ دادی.

1 پسندیده