{"id":16324058,"url":"https://github.com/lionad-morotar/anysort","last_synced_at":"2025-03-16T14:31:04.361Z","repository":{"id":44730034,"uuid":"512702096","full_name":"Lionad-Morotar/Anysort","owner":"Lionad-Morotar","description":"Anysort，符合直觉的多属性排序方法，类型完备，Flexible and Full Typed multi-properties sorter for nested objects","archived":false,"fork":false,"pushed_at":"2024-07-19T13:16:25.000Z","size":533,"stargazers_count":8,"open_issues_count":13,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-09T05:06:52.727Z","etag":null,"topics":["anysort","attributes-sort","multi-attribute","multi-index","multi-sort","nested-objects","sort","stable-sort"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lionad-Morotar.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-11T09:56:04.000Z","updated_at":"2024-10-31T02:07:19.000Z","dependencies_parsed_at":"2023-12-26T08:32:09.789Z","dependency_job_id":"d671861e-1d54-40ec-a7ef-5f21146a4ef1","html_url":"https://github.com/Lionad-Morotar/Anysort","commit_stats":{"total_commits":171,"total_committers":7,"mean_commits":"24.428571428571427","dds":"0.14619883040935677","last_synced_commit":"a1d8de9a2debf71ed5db4443f53fd9087eccf518"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lionad-Morotar%2FAnysort","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lionad-Morotar%2FAnysort/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lionad-Morotar%2FAnysort/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lionad-Morotar%2FAnysort/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lionad-Morotar","download_url":"https://codeload.github.com/Lionad-Morotar/Anysort/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243818195,"owners_count":20352629,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anysort","attributes-sort","multi-attribute","multi-index","multi-sort","nested-objects","sort","stable-sort"],"created_at":"2024-10-10T22:56:28.316Z","updated_at":"2025-03-16T14:31:03.710Z","avatar_url":"https://github.com/Lionad-Morotar.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Anysort\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./statics/LOGO.jpg\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAnysort：符合直觉、类型完备的多属性排序方法\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Coverage-98%25-83A603.svg?prefix=$coverage$\"\u003e\n  \u003cspan\u003e\u0026nbsp;\u003c/span\u003e\n  \u003ca href=\"https://github.com/Lionad-Morotar/anysort/blob/main/LICENSE\"\u003e\n    \u003cimg alt=\"MIT License\" src=\"https://img.shields.io/github/license/Lionad-Morotar/anysort\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\u003c/p\u003e\n\n## Why Anysort\n\nA picture is worth a thousand words.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./statics/simple-usage.png\"\u003e\n\u003c/p\u003e\n\nproject moved from [Lionad-Morotar/anysort-old](https://github.com/Lionad-Morotar/any-sort-old)\n\n## Install\n\n```sh\nnpm install --save anysort-typed\n```\n\n## Why Anysort\n\n* Anysort can sort with multi-attributes\n\n```js\n// select articles which has 'it' tag, put ahead,\n// then move articles which status is 'editing' at the beginning\nanysort(articles)\n  .tag.has('it')\n  .status.is('editing')\n  .map(print)\n```\n\n* Intuitive\n\n```js\n// Array.prototype.sort: what hell the result is!\n[].sort.apply([0, '0', 1, 'd', '1', '0', 0, ''])\n// ['', 0, '0', '0', 0, 1, '1', 'd']\n\n// Anysort：the result is intuitive\nanysort([0, '0', 1, undefined, 'd', '1', '0', null, 0, '', undefined])\n// [0, 0, 1, '', '0', '0', '1', 'd']\n```\n\n* Flexible API\n\n```js\n// proxy chain api\nanysort(articles).created.date.reverse()\n\n// or\nanysort(articles, 'created.date-reverse()')\n```\n\n* Full typed, even in call-with-string-mode, **AMAZING**!\n\n```js\n// @ts-expect-error\nanysort(articles).tag.hass('it')\n// @ts-expect-error\nanysort(articles, 'created.date-unknownPlugin()')\n// OK!\nanysort(articles).created.date.reverse()\n// OK!\nanysort(articles, 'created.date-reverse()')\n// @ts-expect-error\nanysort(articles).created.date.reverse(123)\n// @ts-expect-error\nanysort(articles, 'created.date-reverse(123)')\n```\n\n* Zero dependencies（minified + gzip ≈ 3KB）\n\n* Well tested, logic and type\n\n* \u003cdel\u003eWIP: Full API document\u003c/del\u003e, help wanted\n\n* \u003cdel\u003eWIP: Benchmark\u003c/del\u003e, help wanted\n\n## Usage\n\nShort instruction。\n\n```js\nconst posts = getPosts()\nconst print = (x) =\u003e console.log(JSON.stringify(x))\n\n// select articles being edited with IT tags,\n// sorted by date in reverse order and time in positive order\nanysort(posts, [\n  'status-is(editing)',\n  'tag-has(it)',\n  'created.date-reverse()',\n  'created.hour'\n]).map(print)\n\n// {\"tag\":[\"it\"],\"status\":\"editing\",\"created\":{\"date\":\"2021-01-02T00:00:00.000Z\",\"hour\":23}}\n// {\"tag\":[\"it\"],\"status\":\"editing\",\"created\":{\"date\":\"2021-01-01T00:00:00.000Z\",\"hour\":16}}\n// {\"tag\":[\"game\",\"it\"],\"status\":\"editing\",\"created\":{\"date\":\"2021-01-01T00:00:00.000Z\",\"hour\":23}}\n// {\"tag\":[\"mp3\"],\"status\":\"\",\"created\":{\"date\":\"2019-08-01T00:00:00.000Z\",\"hour\":23}}\n\n// sick of using string manipulation?\n// try this!\nanysort(getPosts())\n  .created.hour.result()\n  .created.date.reverse()\n  .tag.has('it')\n  .status.is('editing')\n  .map(print)\n\n// {\"tag\":[\"it\"],\"status\":\"editing\",\"created\":{\"date\":\"2021-01-02T00:00:00.000Z\",\"hour\":23}}\n// {\"tag\":[\"it\"],\"status\":\"editing\",\"created\":{\"date\":\"2021-01-01T00:00:00.000Z\",\"hour\":16}}\n// {\"tag\":[\"game\",\"it\"],\"status\":\"editing\",\"created\":{\"date\":\"2021-01-01T00:00:00.000Z\",\"hour\":23}}\n// {\"tag\":[\"mp3\"],\"status\":\"\",\"created\":{\"date\":\"2019-08-01T00:00:00.000Z\",\"hour\":23}}\n\nfunction getPosts () {\n  return [\n    {\n      tag: ['mp3'],\n      status: '',\n      created: {\n        date: new Date('2019-08-01'),\n        hour: 23\n      }\n    },\n    {\n      tag: ['game', 'it'],\n      status: 'editing',\n      created: {\n        date: new Date('2021-01-01'),\n        hour: 23\n      }\n    },\n    {\n      tag: ['it'],\n      status: 'editing',\n      created: {\n        date: new Date('2021-01-01'),\n        hour: 16\n      }\n    },\n    {\n      tag: ['it'],\n      status: 'editing',\n      created: {\n        date: new Date('2021-01-02'),\n        hour: 23\n      }\n    }\n  ]\n}\n```\n\n## Full API Doc\n\nTODO\n\n## Change Log\n\nSee [ChangeLog.md](./CHANGELOG.md)\n\n## Dev \u0026 Test\n\n```sh\n# run test when files change in directory build\nnpm run watch:test\n\n# modify source code then build\nnpm run build\n```\n\n## How this work\n\n[《🌐 Anysort：灵活、优雅的多属性排序》](https://lionad.art/articles/anysort-2th)\n\n## Pull \u0026 Request\n\nSee [TODO.MD](./TODO.md)，help wanted!\n\n## Related Projects\n\n* [sort-by](https://github.com/kvnneff/sort-by)\n* [array-sort](https://github.com/jonschlinkert/array-sort)\n* [sort-on](https://github.com/sindresorhus/sort-on)\n* [...](https://github.com/search?q=property+sort\u0026type=Repositories)\n\n## License\n\nCopyright © 2021, [Lionad-Morotar](https://github.com/Lionad-Morotar).\nReleased under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flionad-morotar%2Fanysort","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flionad-morotar%2Fanysort","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flionad-morotar%2Fanysort/lists"}