2016-12-07 9 views
0

Я работаю над проектом Jekyll, который имеет файл people.json в папке _data. Форматирование файла JSON, как так:Jekyll `_data/people.json` массивы: реформирование и сортировка

{ 
    "name" : "George Michael", 
    "topics" : ["Egg", "Cousins"], 
    "contact" : [ 
     { 
      "email" : "[email protected]", 
      "twitter" : "@name" 
     } 
    ] 
}, 
{ 
    "name" : "Tobias", 
    "topics" : ["Analyst", "Therapist"], 
    "contact" : [ 
     { 
      "email" : "[email protected]", 
      "twitter" : "@name" 
     } 
    ] 
} 

То, что я хотел бы сделать, это создать список тегов, своего рода, используя topics информацию. Я пробовал:

{% for tag in site.data.people %} 
<li> 
    {{ tag.topics }} 
</li> 
{% endfor %} 

Который возвращает:

<li>EggCousins</li> 
<li>AnalystTherapist</li> 

В идеале, разметка я хотел бы вернулся бы:

<li>Analyst</li> 
<li>Cousins</li> 
<li>Egg</li> 
<li>Therapist</li> 

Я траления Жидкая документы, и Я думаю, что я могу перебрать их и разбить их на новый массив с split, а затем применить sort, но способ действительно этого ускользает от меня полностью.

Любая помощь была бы принята с благодарностью. Спасибо.

ответ

0

Во-первых, ваш JSON не является действительным. Мой jekyll, кажется, предпочитает:

[ 
    { 
     "name" : "George Michael", 
     "topics" : ["Egg", "Cousins"], 
     "contact" : [ 
      { 
       "email" : "[email protected]", 
       "twitter" : "@name" 
      } 
     ] 
    }, 
    { 
     "name" : "Tobias", 
     "topics" : ["Analyst", "Therapist"], 
     "contact" : [ 
      { 
       "email" : "[email protected]", 
       "twitter" : "@name" 
      } 
     ] 
    } 
] 

Тем не менее, я нахожу это решение довольно хорошим. Обратите внимание, что первый цикл for должен создавать массив тем без дубликатов.

{% comment %}Create an empty array for topics{% endcomment %} 
{% assign topics = "" | split: "/" %} 

{% for author in site.data.people %} 
    {% for topic in author.topics %} 

    {% comment %} As we don't want duplicates in our "topics" list we test it {% endcomment %} 
    {% if topics contains topic %} 
     {% comment %} Do nothing. Could have used unless, but I find if else more expressive. {% endcomment %} 
    {% else %} 
     {% assign topics = topics | push: topic %} 
    {% endif %} 

    {% endfor %} 
{% endfor %} 

Here you have a nice list which you can loop in : {{ topics | inspect }} 
+0

Спасибо, это отлично! – mradamw

0

Попробуйте это решение:

{% for tag in site.data.people %} 
    {% for item in tag %} 
    <li> 
     {{ item }} 
    </li> 
    {% endfor %} 
{% endfor %}