{"id":38860113,"url":"https://github.com/shuckster/sift-r","last_synced_at":"2026-01-17T14:21:12.360Z","repository":{"id":57359300,"uuid":"456281873","full_name":"shuckster/sift-r","owner":"shuckster","description":"Apportion objects / arrays into multiple buckets based on a predicate / pattern.","archived":false,"fork":false,"pushed_at":"2022-10-04T17:44:58.000Z","size":219,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-02T17:38:36.163Z","etag":null,"topics":["apportioning","filtering","grouping","partition","sifting","splitting"],"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/shuckster.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-02-06T21:53:27.000Z","updated_at":"2022-02-07T01:23:55.000Z","dependencies_parsed_at":"2022-09-06T22:22:05.645Z","dependency_job_id":null,"html_url":"https://github.com/shuckster/sift-r","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/shuckster/sift-r","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuckster%2Fsift-r","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuckster%2Fsift-r/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuckster%2Fsift-r/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuckster%2Fsift-r/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shuckster","download_url":"https://codeload.github.com/shuckster/sift-r/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shuckster%2Fsift-r/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28509941,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["apportioning","filtering","grouping","partition","sifting","splitting"],"created_at":"2026-01-17T14:21:12.298Z","updated_at":"2026-01-17T14:21:12.352Z","avatar_url":"https://github.com/shuckster.png","language":"JavaScript","funding_links":["https://www.buymeacoffee.com/shuckster"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\u003ccode\u003esift-r\u003c/code\u003e 📥\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/shuckster/sift-r/blob/master/LICENSE\"\u003e\n    \u003cimg\n      alt=\"MIT license\"\n      src=\"https://img.shields.io/npm/l/sift-r?style=plastic\"\n    /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/sift-r\"\u003e\n    \u003cimg\n      alt=\"Downloads per week\"\n      src=\"https://img.shields.io/npm/dw/sift-r?style=plastic\"\n    /\u003e\u003c/a\u003e\n  \u003ca href=\"https://bundlephobia.com/result?p=sift-r\"\u003e\n    \u003cimg\n      alt=\"npm bundle size\"\n      src=\"https://img.shields.io/bundlephobia/minzip/sift-r?style=plastic\"\n    /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/sift-r\"\u003e\n    \u003cimg\n      alt=\"Version\"\n      src=\"https://img.shields.io/npm/v/sift-r?style=plastic\"\n    /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nA complement to [match-iz](https://github.com/shuckster/match-iz) for filtering objects, arrays, and `Map`/`Set` based on a `match-iz` pattern.\n\n- 🗺 [byPattern() for map/filter](#bypattern)\n- 📥 [sift() an object](#sift-an-object)\n- 📁 [sift() an array](#sift-an-array)\n- 🗂 [sift() an array into multiple buckets](#sift-an-array-into-multiple-buckets)\n- 🗺 [sift() a Map or Set](#sift-a-map-or-set)\n- 🔢 [sift() an iterable](#sift-an-iterable)\n- 📖 [Documentation](https://github.com/shuckster/sift-r/wiki)\n- 📀 [Install / Use](#install--use)\n\n### `byPattern()`\n\n```js\nimport { byPattern } from 'sift-r'\n\nconst filtered = [\n  { user: 'barney', age: 36, active: false },\n  { user: 'fred', age: 40, active: true },\n  { user: 'pebbles', age: 1, active: false }\n].filter(\n  byPattern({\n    age: 36\n  })\n)\n\n// filtered ===\n//   [\n//     { user: 'barney', age: 36, active: false }\n//   ]\n\nimport { pluck, isNumber } from 'match-iz'\n\nconst mapped = [\n  { user: 'barney', age: 36, active: false },\n  { user: 'fred', age: 40, active: true },\n  { user: 'pebbles', age: 1, active: false },\n  { user: '', age: 'not-a-number', active: true }\n].map(\n  byPattern({\n    age: pluck(isNumber)\n  })\n)\n\n// mapped === [36, 40, 1, undefined]\n```\n\n### `sift()` an object\n\n```js\nimport { sift } from 'sift-r'\n\nconst isString = x =\u003e typeof x === 'string'\nconst isNumber = x =\u003e typeof x === 'number'\n\nconst [strValues, numValues, neither] = sift(\n  {\n    title: 'header',\n    slug: 1,\n    markdown: '# header',\n    footer: undefined\n  },\n  [isString, isNumber]\n)\n\n// strValues ===\n//   {\n//     title: 'header',\n//     markdown: '# header'\n//   }\n\n// numValues ===\n//   {\n//     slug: 1\n//   }\n\n// neither ===\n//   {\n//     footer: undefined\n//   }\n```\n\n### `sift()` an array\n\n(+using [match-iz](https://github.com/shuckster/match-iz) pattern-helpers)\n\n```js\nimport { sift } from 'sift-r'\nimport { gte, allOf } from 'match-iz'\n\nconst users = [\n  { user: 'barney', age: 36, active: false },\n  { user: 'fred', age: 40, active: true },\n  { user: 'pebbles', age: 1, active: true }\n]\n\nconst isActive = { active: true }\nconst isGrownUp = { age: gte(18) }\nconst isActiveGrownUp = allOf(isActive, isGrownUp)\n\nconst [activeGrownUps, everyoneElse] = sift(users, isActiveGrownUp)\n\n// activeGrownUps ===\n//   [\n//     { user: 'fred', age: 40, active: true }\n//   ]\n\n// everyoneElse ===\n//   [\n//     { user: 'barney', age: 36, active: false },\n//     { user: 'pebbles', age: 1, active: true }\n//   ]\n```\n\n### `sift()` an array into multiple buckets\n\n```js\nimport { sift } from 'sift-r'\nimport { lt } from 'match-iz'\n\nconst [oneYearOlds, lessThan40, theRest] = sift(\n  [\n    { user: 'barney', age: 36, active: false },\n    { user: 'fred', age: 40, active: true },\n    { user: 'pebbles', age: 1, active: false }\n  ],\n  { age: 1, active: false },\n  { age: lt(40) }\n)\n\n// oneYearOlds ===\n//   [{ user: 'pebbles', age: 1, active: false }]\n\n// lessThan40 ===\n//   [{ user: 'barney', age: 36, active: false }]\n\n// theRest ===\n//   [{ user: 'fred', age: 40, active: true }]\n```\n\n### `sift()` a `Map` or `Set`\n\n`Set` example:\n\n```js\nimport { sift } from 'sift-r'\nimport { lt } from 'match-iz'\n\nconst [oneYearOlds, lessThan40, theRest] = sift(\n  new Set([\n    { user: 'barney', age: 36, active: false },\n    { user: 'fred', age: 40, active: true },\n    { user: 'pebbles', age: 1, active: false }\n  ]),\n  { age: 1, active: false },\n  { age: lt(40) }\n)\n\n// oneYearOlds ===\n//   new Set([\n//     { user: 'pebbles', age: 1, active: false }\n//   ])\n\n// lessThan40 ===\n//   new Set([\n//     { user: 'barney', age: 36, active: false }\n//   ])\n\n// theRest ===\n//   new Set([\n//     { user: 'fred', age: 40, active: true }\n//   ])\n```\n\n`Map` example:\n\n```js\nimport { sift } from 'sift-r'\nimport { lt } from 'match-iz'\n\nconst [oneYearOlds, lessThan40, theRest] = sift(\n  new Map([\n    [0, { user: 'barney', age: 36, active: false }],\n    [1, { user: 'fred', age: 40, active: true }],\n    [2, { user: 'pebbles', age: 1, active: false }]\n  ]),\n  { age: 1, active: false },\n  { age: lt(40) }\n)\n\n// oneYearOlds ===\n//   new Map([\n//     [2, { user: 'pebbles', age: 1, active: false }]\n//   ])\n\n// lessThan40 ===\n//   new Map([\n//     [0, { user: 'barney', age: 36, active: false }]\n//   ])\n\n// theRest ===\n//   new Map([\n//     [1, { user: 'fred', age: 40, active: true }]\n//   ])\n```\n\n### `sift()` an iterable\n\n```js\nimport { sift } from 'sift-r'\nimport { lt } from 'match-iz'\n\nfunction* flintstones() {\n  yield { user: 'barney', age: 36, active: false }\n  yield { user: 'fred', age: 40, active: true }\n  yield { user: 'pebbles', age: 1, active: false }\n}\n\nconst [oneYearOlds, lessThan40, theRest] = sift(\n  flintstones(),\n  { age: 1, active: false },\n  { age: lt(40) }\n)\n\n// oneYearOlds ===\n//   [{ user: 'pebbles', age: 1, active: false }]\n\n// lessThan40 ===\n//   [{ user: 'barney', age: 36, active: false }]\n\n// theRest ===\n//   [{ user: 'fred', age: 40, active: true }]\n```\n\n## Install / Use\n\n```\n$ pnpm i sift-r\n```\n\nSupports `import`/`require` for ESM/CJS.\n\nBrowser/UMD version here:\n\n```html\n\u003cscript src=\"https://unpkg.com/sift-r/dist/browser/sift-r.browser.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const { sift, byPattern } = siftr\n\u003c/script\u003e\n```\n\n# Documentation\n\n`sift()` has several call-signatures, all of which are [documented on the Wiki](https://github.com/shuckster/sift-r/wiki).\n\n# Credits\n\n`sift-r` was written by [Conan Theobald](https://github.com/shuckster/).\n\nI hope you found it useful! If so, I like [coffee ☕️](https://www.buymeacoffee.com/shuckster) :)\n\n## License\n\nMIT licensed: See [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshuckster%2Fsift-r","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshuckster%2Fsift-r","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshuckster%2Fsift-r/lists"}