2015-08-11 2 views
0

Я хочу взять массив и определить, сколько совпадающих элементов находится внутри, а затем подсчитать их, чтобы определить, какие из них имеют самые те же элементы.Liquid - Как подсчитать совпадающие элементы в массиве?

Пример:

{% assign variable = "Cats|Dogs|Mice|Cats|Cats" | split:'|' %} 

{% for v in variable %} 

    // Da-da-da, magic happens here, count matching elements. 

{% endfor %} 

{{ mostCommon }} // Return the most common element in array being Cats. 

Кто-нибудь делал это раньше? Я только дизайнер, поэтому я не могу дать лучший пример :)

ответ

2

Так что я не решаюсь поделиться этим с вами ... тем более, что вы так четко заявляете, что являетесь «всего лишь» дизайнером (и, вероятно, не хотят вдаваться в технические подробности). Но так как вы спросили, вот мое решение.

{% 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. Создает набор (только уникальные элементы) из массива.
  2. Удаляет набор из массива.
  3. Если массив пуст, последний выбранный нами набор является «самым встречным набором».
  4. Перейти к 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.

+0

Спасибо Shadowen, я попробую и посмотрю, смогу ли я заставить его работать! –

+0

Hey Shadowen, поэтому, когда я пытаюсь включить этот код, он просто сообщает мне об ошибке: Недопустимое имя шаблона. Я попробовал это несколькими разными способами, я скопировал оба варианта в свои собственные файлы. Это правильно? '{% include 'include/array_remove'%} {% assign array = 'Кошки | Собаки | Мыши | Кошки | Кошки | Мыши | Мыши | раскол: '|' %} {% capture mostCommonString%} {% include 'include/most_occurences' array = array%} {% endcapture%} {% assign mostCommon = mostCommonString | split: '|' %} {{mostCommon | join: ","}} ' –

+0

Да, они должны быть в их собственных файлах, как указано в ** bolded ** именах файлов по каждому сегменту кода в моем ответе. Однако вам не нужно добавлять 'include /' к имени файла, когда '{% include%}' ing. Джекил знает, что нужно искать в папке '_include'. У вас должно быть три файла: ' .html',' most-entriesences' и 'array-remove'. Последние два должны находиться в папке '_include'. – Shadowen

Смежные вопросы