2017-11-06 6 views
3

ジキルコレクションを各コレクションに含まれるドキュメント数で並べ替えたい。 site.collections変数ジキル:サイズでコレクションを並べ替え

各コレクションはdocsフィールドを有し、(文書の配列である)docsフィールドは、このコレクション内のドキュメントの数(documentation参照)sizeフィールドを、有しています。

しかし、このような何かがうまくいかない:

{% assign sorted = site.collections | sort: 'docs.size' %} 

{% for coll in sorted %} 
    ... 
{% endfor %} 

sortへの引数はオブジェクトのみのタイプの直接のフィールドであることを思わ

Liquid Exception: no implicit conversion of String into Integer 

になりそのフィールドのフィールドではなく、ソートされる。

コレクションに含まれるドキュメントの数でコレクションをソートする方法はありますか?

+0

あなたは '{%assign sorted = site.collections | sort:docs.size%} '? ie ** 'sort:docs.size' ** – ashmaroli

+0

あなたは引用符を使わずに意味しますか?はい、エラーは 'Liquid Exception:Liquid error(14行目):Jekyll :: Drops :: CollectionDropとJekyll :: Drops :: CollectionDrop failedの比較 'です。 – weibeld

+0

バグがあるかどうか、またはこのように動作していないとわからない場合は、ソートフィルタの[documentation](https://help.shopify.com/themes/liquid/filters/array-filters#sort)はあまり役に立ちません。 – weibeld

答えて

1
  1. ビルド利用可能なサイズの配列:

    {% assign sorted = '' | split: "" %} 
    {% for coll in site.collections %} 
        {% assign sorted = sorted| append: coll.docs.size %} 
    {% endfor %} 
    
  2. ソート上記アレイ。

  3. 並べ替えられた配列番号と同じサイズのコレクションのみを出力して、上記の配列とすべてのコレクションを繰り返します。
+0

私はあなたが何を意味しているか知っています。しかし問題は、このように作成された配列は文字列の配列になり、この配列をソートしても正しい数値の順序は得られないということです。 Liquidで整数の配列を作成することは可能ですか? – weibeld

2

[OK]を、私はかなり醜い方法で、marcanuy's answerの行に沿って達成しました。

<!-- Create a comma-separated string of all the sizes of the collections --> 
{% for coll in site.collections %} 
    {% if coll.title %} 
     {% if coll.docs.size < 10 %} 
     {% assign str = coll.docs.size | prepend: "00" %} 
     {% elsif coll.docs.size < 100 %} 
     {% assign str = coll.docs.size | prepend: "0" %} 
     {% else %} 
     {% assign str = coll.docs.size %} 
     {% endif %} 
     {% assign sizes = sizes | append: str | append: "," %} 
    {% endif %} 
{% endfor %} 

<!-- Remove last comma of string --> 
{% assign length = sizes | size | minus: 1 %} 
{% assign sizes = sizes | slice: 0, length %} 

<!-- Split string into array, sort DESC, and remove duplicate elements --> 
{% assign sizes = sizes | split: "," | sort | reverse | uniq %} 

<!-- Iterate through sizes, and for each size print those collections that have this size --> 
{% for s in sizes %} 
    {% for coll in site.collections %} 
    {% assign i = s | plus: 0 %} 
    {% if coll.docs.size == i %} 
     <p>{{ coll.title }}: {{ i }} documents</p> 
    {% endif %} 
    {% endfor %} 
{% endfor %} 

主な困難は、このように作成されたサイズのアレイは、文字列の配列であることであり、それはむしろ数値一方(例えば"15""2"の前に)よりも、アルファベットソート順序になるソーティング。

この問題を解決するには、数字が10より小さい数字には"00"、数字では"0"が100より小さい数字になります。これにより、アルファベット順のソート順が目的の数値ソート順になります。

次に、これらのサイズ(まだ文字列です)を繰り返して、それらを各コレクションのdocs.sizeフィールドと比較できるように、それらを即座に整数に変換します(plus: 0)。

かなり冗長ですが、これはサイトが生成されたときにのみ実行されるため、運用モードの各要求では実行されないため、問題ありません。

まだ、より良い解決策は歓迎です!

関連する問題