{"id":20723559,"url":"https://github.com/gagan-bansal/json-groupby","last_synced_at":"2025-04-23T17:28:15.204Z","repository":{"id":7413962,"uuid":"56299028","full_name":"gagan-bansal/json-groupby","owner":"gagan-bansal","description":"Group json data based on properties of json","archived":false,"fork":false,"pushed_at":"2024-03-26T16:52:48.000Z","size":55,"stargazers_count":19,"open_issues_count":3,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-04-28T03:55:08.939Z","etag":null,"topics":["group","groupby","json","json-properties"],"latest_commit_sha":null,"homepage":null,"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/gagan-bansal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"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":"2016-04-15T07:07:21.000Z","updated_at":"2024-06-18T16:51:21.498Z","dependencies_parsed_at":"2024-06-18T16:51:17.675Z","dependency_job_id":"74f2f782-d10b-4fd6-a792-965069507908","html_url":"https://github.com/gagan-bansal/json-groupby","commit_stats":{"total_commits":13,"total_committers":2,"mean_commits":6.5,"dds":0.07692307692307687,"last_synced_commit":"3f914128b6487f9e6872a792a05ec8be3d6468b2"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gagan-bansal%2Fjson-groupby","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gagan-bansal%2Fjson-groupby/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gagan-bansal%2Fjson-groupby/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gagan-bansal%2Fjson-groupby/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gagan-bansal","download_url":"https://codeload.github.com/gagan-bansal/json-groupby/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250479755,"owners_count":21437423,"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":["group","groupby","json","json-properties"],"created_at":"2024-11-17T04:09:05.880Z","updated_at":"2025-04-23T17:28:15.179Z","avatar_url":"https://github.com/gagan-bansal.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# json-groupby\nGroup array of JSON objects based on associated properties.\n\nIt also groups objects containing [nested arrays](#nested-arrays).\n\n## installation\n\n```\nnpm install json-groupby\n```\n\n## usage\n\n```javascript\nvar groupBy = require('json-groupby')\nvar group = groupBy(array, properties [, collect])\n```\n* **array**  Array of JSON objects\n* **properties**  Array JSON properties' path like `address.city` or lookup object\n\n  **lookup**\n  ```\n  {\n    intervals: array of numbers\n    ,property: string\n    [,labels: array of string]\n  }\n  ``` \n  **intervals** Array of intervals. Like [ 10, 20, 30, 40, 50] group the data in four ranges, whereas lower bound is inclusive and upper bound is exclusive.\n\n  **peroperty** Property path like `price`\n\n  **labels** Array of interval labels like [ 'low', 'medium', 'high']\n\n* **collect** Array of properties that need to be collected in array \n\n### examples\n\n#### data set\n\n```javascript\nvar products = \n [{\"id\": 1,\n   \"product\": \"ri\", \"price\": 16, \"color\": \"green\", \"available\": false,\n   \"tags\": [\"bravo\"],\n   \"vendor\": {\"name\": \"Donald Chambers\", \"address\": {\"city\": \"Mumbai\"}}},\n  {\"id\": 2,\n   \"product\": \"foef\", \"price\": 44, \"color\": \"yellow\", \"available\": false,\n   \"tags\": [\"alpha\"],\n   \"vendor\": {\"name\": \"Barbara Garrett\", \"address\": {\"city\": \"Mumbai\"}}},\n  {\"id\": 3,\n   \"product\": \"jehnojto\", \"price\": 29, \"color\": \"red\", \"available\": true,\n   \"tags\": [\"alpha\"],\n   \"vendor\": {\"name\": \"Anne Leonard\", \"address\": {\"city\": \"New York\"}}},\n  {\"id\": 4,\n   \"product\": \"ru\", \"price\": 35, \"color\": \"yellow\", \"available\": false,\n   \"tags\": [\"echo\", \"charlie\", \"bravo\"],\n   \"vendor\": {\"name\": \"Justin Doyle\", \"address\": {\"city\": \"London\"}}},\n  {\"id\": 5,\n   \"product\": \"pihluve\", \"price\": 47, \"color\": \"green\", \"available\": true,\n   \"tags\": [\"delta\", \"echo\", \"bravo\"],\n   \"vendor\": {\"name\": \"Emily Abbott\", \"address\": {\"city\": \"New York\"}}},\n  {\"id\": 6,\n   \"product\": \"dum\", \"price\": 28, \"color\": \"green\", \"available\": true,\n   \"tags\": [\"echo\", \"delta\", \"charlie\"],\n   \"vendor\": {\"name\": \"Henry Peterson\", \"address\": {\"city\": \"New York\"}}},\n  {\"id\": 7,\n   \"product\": \"zifpeza\", \"price\": 10, \"color\": \"green\", \"available\": false,\n   \"tags\": [\"echo\", \"charlie\", \"bravo\"],\n   \"vendor\": {\"name\": \"Jesus Lowe\", \"address\": {\"city\": \"Mumbai\"}}},\n  {\"id\": 8,\n   \"product\": \"av\", \"price\": 39, \"color\": \"green\", \"available\": true,\n   \"tags\": [\"bravo\"],\n   \"vendor\": {\"name\": \"Rosalie Erickson\", \"address\": {\"city\": \"New York\"}}}]\n\n```\n\n\n#### group by single property\n\n```javascript\ngroupBy(products, ['color'], ['id'])\n// output is \n{ green: { id: [ 1, 5, 6, 7, 8 ] },\n  yellow: { id: [ 2, 4 ] },\n  red: { id: [ 3 ] } }\n```\n\n#### group by many properties and without collect option\n\n```javascript\ngroupBy(products, ['available', 'color', 'vendor.address.city'])\n// output is \n{\"false\": \n  {\"green\": \n    {\"Mumbai\": [\n      {\"id\": 1, \"product\": \"ri\", \"price\": 16, \"color\": \"green\", \n       \"available\": false, \"tags\": [\"bravo\"], \n       \"vendor\": {\"name\": \"Donald Chambers\",  \"address\": {\"city\": \"Mumbai\"}}},\n      {\"id\": 7, \"product\": \"zifpeza\", \"price\": 10, \"color\": \"green\",\n       \"available\": false, \"tags\": [\"echo\", \"charlie\", \"bravo\"],\n       \"vendor\": {\"name\": \"Jesus Lowe\", \"address\": {\"city\": \"Mumbai\"}}}]},\n   \"yellow\": {\n     \"Mumbai\": [\n       {\"id\": 2, \"product\": \"foef\", \"price\": 44, \"color\": \"yellow\", \n        \"available\": false, \"tags\": [\"alpha\"], \n        \"vendor\": {\"name\": \"Barbara Garrett\",  \"address\": {\"city\": \"Mumbai\"}}}], \n     \"London\": [\n       {\"id\": 4, \"product\": \"ru\", \"price\": 35, \"color\": \"yellow\",\n        \"available\": false, \"tags\": [\"echo\", \"charlie\", \"bravo\"],\n        \"vendor\": {\"name\": \"Justin Doyle\", \"address\": {\"city\": \"London\"}}}]}},\n \"true\": \n  {\"red\": \n    {\"New York\": [\n      {\n        \"id\": 3, \"product\": \"jehnojto\", \"price\": 29, \"color\": \"red\",\n        \"available\": true, \"tags\": [\"alpha\"],\n        \"vendor\": {\"name\": \"Anne Leonard\", \"address\": {\"city\": \"New York\"}}}]},\n   \"green\": {\n     \"New York\": [\n        {\"id\": 5, \"product\": \"pihluve\", \"price\": 47, \"color\": \"green\",\n         \"available\": true, \"tags\": [\"delta\", \"echo\", \"bravo\"],\n         \"vendor\": {\"name\": \"Emily Abbott\", \"address\": {\"city\": \"New York\"}}},\n         {\"id\": 6, \"product\": \"dum\", \"price\": 28, \"color\": \"green\",\n         \"available\": true, \"tags\": [\"echo\", \"delta\", \"charlie\"],\n         \"vendor\": {\"name\": \"Henry Peterson\", \"address\": {\"city\": \"New York\"}}},\n         {\"id\": 8, \"product\": \"av\", \"price\": 39, \"color\": \"green\",\n         \"available\": true, \"tags\": [\"bravo\"],\n         \"vendor\": {\"name\": \"Rosalie Erickson\", \"address\": {\"city\": \"New York\"}}}\n     ]}}}\n``` \n\n#### single deep path property\n \n```javascript\ngroupBy(products, ['vendor.address.city'], ['id'])\n// output is \n{ Mumbai: { id: [ 1, 2, 7 ] },\n  'New York': { id: [ 3, 5, 6, 8 ] },\n  London: { id: [ 4 ] } }\n```   \n\n#### group with boolean property\n\n```javascript\ngroupBy(products, ['available'], ['id'])\n// output is \n{ false: { id: [ 1, 2, 4, 7 ] }, \n  true: { id: [ 3, 5, 6, 8 ] }}\n```  \n\n#### group by intervals (lookup of intervals) without intervals' name\n\n```javascript \ngroupBy(\n  products, \n  [{property: 'price', intervals: [10,20,40,50]}],\n  ['id'])\n//output is \n{ '0': { id: [ 1, 7 ] },\n  '1': { id: [ 3, 4, 6, 8 ] },\n  '2': { id: [ 2, 5 ] } }\n``` \n\n#### group by intervals (lookup of intervals) with intervals' lable name \n\n```javascript\ngroupBy(\n  products, \n  [{\n    property: 'price', \n    intervals: [10,20,40,50], \n    labels: ['low','medium','high']}],\n  ['id'])\n//ouptu is \n{'low': { id: [ 1, 7 ] },\n 'medium': { id: [ 3, 4, 6, 8 ] },\n 'high': { id: [ 2, 5 ] } }\n```\n#### group with mixed properties lookup and property path \n\n```javascript\ngroupBy(\n  products, \n  [\n    {\n      property: 'price', \n      intervals: [10,20,40,50], \n      labels: ['low','medium','high']\n    },\n    'vendor.address.city'\n  ],\n  ['id'])\n// output is\n{\n  \"low\":\n    {\"Mumbai\":{\"id\":[1,7]}},\n  \"high\":\n    {\"Mumbai\":{\"id\":[2]},\n    \"New York\":{\"id\":[5]}},\n  \"medium\":\n    {\"New York\":{\"id\":[3,6,8]},\n    \"London\":{\"id\":[4]}}\n```\n\n#### group by tags that are in array \n\n```javascript\ngroupBy(products, ['tags'], ['id'])\n//ouput is\n{ bravo: { id: [ 1, 4, 5, 7, 8 ] },\n  alpha: { id: [ 2, 3 ] },\n  echo: { id: [ 4, 5, 6, 7 ] },\n  charlie: { id: [ 4, 6, 7 ] },\n  delta: { id: [ 5, 6 ] } }\n```\n\n#### group and collect many properties\n\n```javascript\ngroupBy(\n  products, \n  ['color'], \n  ['vendor.address.city', 'available'])\n// output is\n{ green: \n   { 'vendor.address.city': [ 'Mumbai', 'New York', 'New York', 'Mumbai', 'New York' ],\n     available: [ false, true, true, false, true ] },\n  yellow: \n   { 'vendor.address.city': [ 'Mumbai', 'London' ],\n     available: [ false, false ] },\n  red: { 'vendor.address.city': [ 'New York' ], available: [ true ] } }\n```\n\n#### Nested Arrays\n\nGroup by property path that lies in nested arrays, in the following example `addresses.localities.size`\n\n```javascript\nvar vendors = [{\n  id: 1,\n  addresses : [{\n    city: 'a',\n    localities: [\n      {size: \"small\", zipcode: '12345', storeType: ['electronic', 'food']},\n      {size: \"medium\", zipcode: '12346', storeType: ['food']}]\n  }, {\n    city: 'b',\n    localities: [\n      {size: \"medium\", zipcode: '12345', storeType: ['electronic', 'food']},\n      {size: \"small\", zipcode: '12347', storeType: ['electronic']}]\n  }],\n  details: {\n    name: 'foo', \n    items: 400, \n    rating: 'high'}\n}, {\n  id: 2,\n  addresses : [{\n    city: 'a',\n    localities: [\n      {size: \"large\", zipcode: '12345', storeType: ['apparel', 'furniture']},\n      {size: \"small\", zipcode: '12346', storeType: ['furniture']}]\n  }, {\n    city: 'b',\n    localities: [\n      {size: \"small\", zipcode: '12345', storeType: ['food', 'furniture']},\n      {size: \"medium\", zipcode: '12347', storeType: ['food']}]\n  }],\n  details: {\n    name: 'bar', \n    items: 500, \n    rating: 'low'}\n}]\n\nvar group = groupBy(vendors, ['addresses.localities.size'], ['id'])\n\n// output gruop is\n{\n  \"small\": {id: [1, 2]},\n  \"medium\": {id: [1, 2]},\n  \"large\": {id: [2]}\n}\n\n``` \n## developing\nOnce you run\n \n```npm install```\n\nthen for running test \n\n```npm run test```\n\nto create build\n\n```npm run build```\n\n## license\nThis project is licensed under the terms of the MIT license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgagan-bansal%2Fjson-groupby","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgagan-bansal%2Fjson-groupby","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgagan-bansal%2Fjson-groupby/lists"}