Так что я не решаюсь поделиться этим с вами ... тем более, что вы так четко заявляете, что являетесь «всего лишь» дизайнером (и, вероятно, не хотят вдаваться в технические подробности). Но так как вы спросили, вот мое решение.
{% assign array = "Cats|Dogs|Mice|Cats|Cats|Mice|Mice" | split:'|' %}
{% capture mostCommonString %}{% include most-occurences array=array %}{% endcapture %}
{% assign mostCommon = mostCommonString | split: "|" %}
{{ mostCommon | join: ", " }}
Кажется простым, не так ли? Неа. Вам понадобится следующий код в вашей папке _include
для питания {% include %}
:
_include/самый-вхождений
{% assign array = include.array %}{% assign setString = "" %}{% for elem in array %}{% unless setString contains elem %}{% assign setString = setString | append: '|' | append: elem %}{% endunless %}{% endfor %}{% assign set = setString | remove_first: '|' | split: '|' %}{% for x in array %}{% assign removedElements = "" %}{% for elem in set %}{% if array contains elem %}{% capture newArray %}{% include array-remove array=array remove=elem %}{% endcapture %}{% assign array = newArray | split: "|" %}{% assign removedElements = removedElements | append: '|' | append: elem %}{% unless array contains elem %}{% capture newSet %}{% include array-remove array=set remove=elem %}{% endcapture %}{% assign set = newSet | split: "|" %}{% endunless %}{% endif %}{% endfor %}{% assign arraySize = array | size %}{% if arraySize == 0 %}{% break %}{% endif %}{% endfor %}{{ removedElements | remove_first: "|" }}
Это основной алгоритм. В основном это:
- Создает набор (только уникальные элементы) из массива.
- Удаляет набор из массива.
- Если массив пуст, последний выбранный нами набор является «самым встречным набором».
- Перейти к 1.
И чуть-чуть больше:
_include/массив удалить
{% assign ret = "" %}{% assign removed = "false" %}{% for elem in include.array %}{% if elem == include.remove and removed != "true" %}{% assign removed = "true" %}{% continue %}{% endif %}{% assign ret = ret | append: "|" | append: {{elem}} %}{% endfor %}{{ ret | remove_first: "|" }}
Это крошечное (относительно) алгоритм, который удаляет первое вхождение строки из массива.
Просто предупреждение: Множество алгоритмов полагается на использование |
в качестве символа разделителя. Я работаю над a version, который использует &
, который может быть экранирован с помощью фильтра | escape
, но я не вижу, чтобы это было проблемой.
К сожалению, все помещения необходимо удалить, чтобы помочь {% capture %}
not grab extra whitespaces.
Спасибо Shadowen, я попробую и посмотрю, смогу ли я заставить его работать! –
Hey Shadowen, поэтому, когда я пытаюсь включить этот код, он просто сообщает мне об ошибке: Недопустимое имя шаблона. Я попробовал это несколькими разными способами, я скопировал оба варианта в свои собственные файлы. Это правильно? '{% include 'include/array_remove'%} {% assign array = 'Кошки | Собаки | Мыши | Кошки | Кошки | Мыши | Мыши | раскол: '|' %} {% capture mostCommonString%} {% include 'include/most_occurences' array = array%} {% endcapture%} {% assign mostCommon = mostCommonString | split: '|' %} {{mostCommon | join: ","}} ' –
Да, они должны быть в их собственных файлах, как указано в ** bolded ** именах файлов по каждому сегменту кода в моем ответе. Однако вам не нужно добавлять 'include /' к имени файла, когда '{% include%}' ing. Джекил знает, что нужно искать в папке '_include'. У вас должно быть три файла: ' .html',' most-entriesences' и 'array-remove'. Последние два должны находиться в папке '_include'. –
Shadowen