Skip to content

Instantly share code, notes, and snippets.

@y13i
Last active December 11, 2024 08:45
Show Gist options
  • Save y13i/f6df3effbb653dd3d322503c490dd6e1 to your computer and use it in GitHub Desktop.
Save y13i/f6df3effbb653dd3d322503c490dd6e1 to your computer and use it in GitHub Desktop.
オブジェクトのキーをソートするやつ

一年半くらい前に作ったやつの背景を書きたくなったので書く。


JSON で表現できる複雑度をもった任意のオブジェクトについて、それのキーがソートされているがバリューはそのままのオブジェクトがほしい。もしバリューがオブジェクトだったり配列だったりするのであれば、その内容についても再帰的に同じように処理してほしい。

例えば手動での編集が重なり混沌とした JSON/YAML であったり、処理系によっては出力される JSON のキーが順不同(毎回順番が違う)になる場合もあるらしい。キーの順序を一定にできればふたつの JSON の diff も読みやすくなるし、このような需要は常に一定程度あると思われる。

sort-keys というそのままの名前の NPM パッケージがすぐに見つかったのだが、個人的にもう少しやりたいことがあったので新しいツールを作った。

やりたいことの一つは、もしあるキーに対するバリューがオブジェクトや配列でない(つまり数値、文字列、真偽値、NULL のいずれか)ならば、そのキーは優先的に先頭に並べたいというやつ。これは構造が単純なものが先頭にまとまっていた方が見やすいと感じるという動機による。

{
  "a": "A",
  "b": [
    "c",
    "d",
    "e"
  ],
  "f": {
    "g": "G",
    "h": "H"
  },
  "i": "I"
}

より

{
  "a": "A",
  "i": "I",
  "b": [
    "c",
    "d",
    "e"
  ],
  "f": {
    "g": "G",
    "h": "H"
  }
}

の方がうれしくない? ぼくはそう思います。これを可能にするオプションをつけた。

もう一つは、場合によっては名前や内容に関係なく、常に先頭に指定された順序で並んでいてほしいキーバリューってあるよなというやつ。例えば package.json だったら name が最初に来てほしいのを筆頭に、ドキュメント通りの順番になっていてほしい。

ConfigMapSecretkubectl get すると、kindmetadata より先に data が来るのがキモくて、常に優先したいキーの配列をオプションで指定できるようにした。これはテストコードに実行例を入れた

先に書いた既存パッケージでも Compare Function を与えられるようにはなっているのだけど、やりたいことその1を実現するにはキーだけの比較ではどうにもならないのだ。

せっかく作ったので、CLI も提供してついでにそれの Container Image も用意した。npx でも実行できるし、Node がなくても docker run でサッと試せます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment