Как преобразовать строку в массив в clojure

Я хочу преобразовать строку в массив, Я пробовал некоторые шаги, но не получил желаемого результата.

(:require [clojure.string :as str])

(def stringval "fruit==Mango,fruit==Papaya;veggie==Onion,veggie==Potato")

(defn formatting [strFilters]   
(let [filters (str/split strFilters #";")]
    (for [filter filters]
      (let [eachFilter (str/split filter #",")]
        (for [each eachFilter]
          (let [items (str/split each #"= = ")]
            items
            )))))) 
(formatting stringval)

Я получаю ниже вывода

((["fruit" "Mango"] ["fruit" "Papaya"]) (["veggie" "Onion"] ["veggie" "Potato"]))

Мне нужна функция clojure, которая возвращает следующий массив

Array
(
    [fruit] => Array
        (
            [0] => Mango
            [1] => Papaya
        )

    [veggie] => Array
        (
            [0] => Onion
            [1] => Potato
        )

)

Вы имеете в виду массив Java? Значит, результат должен иметь ту же структуру, что и результат (to-array-2d [["Mango" "Papaya"] ["Onion" "Potato"]])?

Martin Půda 12.01.2023 12:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен список карт, поэтому вам нужно превратить текущий промежуточный результаты в карту. Вы можете сделать это с помощью group-by и некоторых других постобработка, или вы можете использовать merge-with conj, если вы формируете результат самого сокровенного for при подготовке к нему. Также обратите внимание, что for может иметь :let в нем.

(require '[clojure.string :as str])

(def s "fruit==Mango,fruit==Papaya;veggie==Onion,veggie==Potato")

(for [g (str/split s #";")]
  (apply merge-with into
         (for [kv (str/split g #",")
               :let [[k v] (str/split kv #"= = ")]]
           {k [v]})))
; → ({"fruit" ["Mango" "Papaya"]} {"veggie" ["Onion" "Potato"]})

И если ваш целевой вывод есть на PHP или на каком-то другом языке, которые неправильно поняли свои базовые структуры данных, и вы на самом деле просто хотите карта с ключами к массивам значений, вам просто нужно сдвинуть merge-with into, и вы также можете разделить на ; и , одним махом.

(apply merge-with into
       (for [kv (str/split s #"[;,]")
             :let [[k v] (str/split kv #"= = ")]]
         {k [v]}))
; → {"fruit" ["Mango" "Papaya"], "veggie" ["Onion" "Potato"]}

Обратите внимание, что простое использование разделения игнорирует проблемы, когда ;, , и == должны быть разрешены для ключей и значений и используются какие-то кавычки. Использование надлежащего синтаксического анализатора было бы защитным выбором.

cfrick 12.01.2023 14:28

еще один вариант - получить все пары с повторной последовательностью и уменьшить ее с помощью группировки:

(->> stringval
     (re-seq #"([^,;].+?)==([^,;$]+)")     
     (reduce (fn [acc [_ k v]] (update acc k conj v)) {}))

;;=> {"fruit" ("Papaya" "Mango"), "veggie" ("Potato" "Onion")}

Другие вопросы по теме