Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/gagan-bansal/json-groupby
Group json data based on properties of json
https://github.com/gagan-bansal/json-groupby
group groupby json json-properties
Last synced: about 6 hours ago
JSON representation
Group json data based on properties of json
- Host: GitHub
- URL: https://github.com/gagan-bansal/json-groupby
- Owner: gagan-bansal
- License: mit
- Created: 2016-04-15T07:07:21.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-03-26T16:52:48.000Z (8 months ago)
- Last Synced: 2024-04-28T03:55:08.939Z (7 months ago)
- Topics: group, groupby, json, json-properties
- Language: JavaScript
- Size: 53.7 KB
- Stars: 19
- Watchers: 6
- Forks: 11
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# json-groupby
Group array of JSON objects based on associated properties.It also groups objects containing [nested arrays](#nested-arrays).
## installation
```
npm install json-groupby
```## usage
```javascript
var groupBy = require('json-groupby')
var group = groupBy(array, properties [, collect])
```
* **array** Array of JSON objects
* **properties** Array JSON properties' path like `address.city` or lookup object**lookup**
```
{
intervals: array of numbers
,property: string
[,labels: array of string]
}
```
**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.**peroperty** Property path like `price`
**labels** Array of interval labels like [ 'low', 'medium', 'high']
* **collect** Array of properties that need to be collected in array
### examples
#### data set
```javascript
var products =
[{"id": 1,
"product": "ri", "price": 16, "color": "green", "available": false,
"tags": ["bravo"],
"vendor": {"name": "Donald Chambers", "address": {"city": "Mumbai"}}},
{"id": 2,
"product": "foef", "price": 44, "color": "yellow", "available": false,
"tags": ["alpha"],
"vendor": {"name": "Barbara Garrett", "address": {"city": "Mumbai"}}},
{"id": 3,
"product": "jehnojto", "price": 29, "color": "red", "available": true,
"tags": ["alpha"],
"vendor": {"name": "Anne Leonard", "address": {"city": "New York"}}},
{"id": 4,
"product": "ru", "price": 35, "color": "yellow", "available": false,
"tags": ["echo", "charlie", "bravo"],
"vendor": {"name": "Justin Doyle", "address": {"city": "London"}}},
{"id": 5,
"product": "pihluve", "price": 47, "color": "green", "available": true,
"tags": ["delta", "echo", "bravo"],
"vendor": {"name": "Emily Abbott", "address": {"city": "New York"}}},
{"id": 6,
"product": "dum", "price": 28, "color": "green", "available": true,
"tags": ["echo", "delta", "charlie"],
"vendor": {"name": "Henry Peterson", "address": {"city": "New York"}}},
{"id": 7,
"product": "zifpeza", "price": 10, "color": "green", "available": false,
"tags": ["echo", "charlie", "bravo"],
"vendor": {"name": "Jesus Lowe", "address": {"city": "Mumbai"}}},
{"id": 8,
"product": "av", "price": 39, "color": "green", "available": true,
"tags": ["bravo"],
"vendor": {"name": "Rosalie Erickson", "address": {"city": "New York"}}}]```
#### group by single property
```javascript
groupBy(products, ['color'], ['id'])
// output is
{ green: { id: [ 1, 5, 6, 7, 8 ] },
yellow: { id: [ 2, 4 ] },
red: { id: [ 3 ] } }
```#### group by many properties and without collect option
```javascript
groupBy(products, ['available', 'color', 'vendor.address.city'])
// output is
{"false":
{"green":
{"Mumbai": [
{"id": 1, "product": "ri", "price": 16, "color": "green",
"available": false, "tags": ["bravo"],
"vendor": {"name": "Donald Chambers", "address": {"city": "Mumbai"}}},
{"id": 7, "product": "zifpeza", "price": 10, "color": "green",
"available": false, "tags": ["echo", "charlie", "bravo"],
"vendor": {"name": "Jesus Lowe", "address": {"city": "Mumbai"}}}]},
"yellow": {
"Mumbai": [
{"id": 2, "product": "foef", "price": 44, "color": "yellow",
"available": false, "tags": ["alpha"],
"vendor": {"name": "Barbara Garrett", "address": {"city": "Mumbai"}}}],
"London": [
{"id": 4, "product": "ru", "price": 35, "color": "yellow",
"available": false, "tags": ["echo", "charlie", "bravo"],
"vendor": {"name": "Justin Doyle", "address": {"city": "London"}}}]}},
"true":
{"red":
{"New York": [
{
"id": 3, "product": "jehnojto", "price": 29, "color": "red",
"available": true, "tags": ["alpha"],
"vendor": {"name": "Anne Leonard", "address": {"city": "New York"}}}]},
"green": {
"New York": [
{"id": 5, "product": "pihluve", "price": 47, "color": "green",
"available": true, "tags": ["delta", "echo", "bravo"],
"vendor": {"name": "Emily Abbott", "address": {"city": "New York"}}},
{"id": 6, "product": "dum", "price": 28, "color": "green",
"available": true, "tags": ["echo", "delta", "charlie"],
"vendor": {"name": "Henry Peterson", "address": {"city": "New York"}}},
{"id": 8, "product": "av", "price": 39, "color": "green",
"available": true, "tags": ["bravo"],
"vendor": {"name": "Rosalie Erickson", "address": {"city": "New York"}}}
]}}}
```#### single deep path property
```javascript
groupBy(products, ['vendor.address.city'], ['id'])
// output is
{ Mumbai: { id: [ 1, 2, 7 ] },
'New York': { id: [ 3, 5, 6, 8 ] },
London: { id: [ 4 ] } }
```#### group with boolean property
```javascript
groupBy(products, ['available'], ['id'])
// output is
{ false: { id: [ 1, 2, 4, 7 ] },
true: { id: [ 3, 5, 6, 8 ] }}
```#### group by intervals (lookup of intervals) without intervals' name
```javascript
groupBy(
products,
[{property: 'price', intervals: [10,20,40,50]}],
['id'])
//output is
{ '0': { id: [ 1, 7 ] },
'1': { id: [ 3, 4, 6, 8 ] },
'2': { id: [ 2, 5 ] } }
```#### group by intervals (lookup of intervals) with intervals' lable name
```javascript
groupBy(
products,
[{
property: 'price',
intervals: [10,20,40,50],
labels: ['low','medium','high']}],
['id'])
//ouptu is
{'low': { id: [ 1, 7 ] },
'medium': { id: [ 3, 4, 6, 8 ] },
'high': { id: [ 2, 5 ] } }
```
#### group with mixed properties lookup and property path```javascript
groupBy(
products,
[
{
property: 'price',
intervals: [10,20,40,50],
labels: ['low','medium','high']
},
'vendor.address.city'
],
['id'])
// output is
{
"low":
{"Mumbai":{"id":[1,7]}},
"high":
{"Mumbai":{"id":[2]},
"New York":{"id":[5]}},
"medium":
{"New York":{"id":[3,6,8]},
"London":{"id":[4]}}
```#### group by tags that are in array
```javascript
groupBy(products, ['tags'], ['id'])
//ouput is
{ bravo: { id: [ 1, 4, 5, 7, 8 ] },
alpha: { id: [ 2, 3 ] },
echo: { id: [ 4, 5, 6, 7 ] },
charlie: { id: [ 4, 6, 7 ] },
delta: { id: [ 5, 6 ] } }
```#### group and collect many properties
```javascript
groupBy(
products,
['color'],
['vendor.address.city', 'available'])
// output is
{ green:
{ 'vendor.address.city': [ 'Mumbai', 'New York', 'New York', 'Mumbai', 'New York' ],
available: [ false, true, true, false, true ] },
yellow:
{ 'vendor.address.city': [ 'Mumbai', 'London' ],
available: [ false, false ] },
red: { 'vendor.address.city': [ 'New York' ], available: [ true ] } }
```#### Nested Arrays
Group by property path that lies in nested arrays, in the following example `addresses.localities.size`
```javascript
var vendors = [{
id: 1,
addresses : [{
city: 'a',
localities: [
{size: "small", zipcode: '12345', storeType: ['electronic', 'food']},
{size: "medium", zipcode: '12346', storeType: ['food']}]
}, {
city: 'b',
localities: [
{size: "medium", zipcode: '12345', storeType: ['electronic', 'food']},
{size: "small", zipcode: '12347', storeType: ['electronic']}]
}],
details: {
name: 'foo',
items: 400,
rating: 'high'}
}, {
id: 2,
addresses : [{
city: 'a',
localities: [
{size: "large", zipcode: '12345', storeType: ['apparel', 'furniture']},
{size: "small", zipcode: '12346', storeType: ['furniture']}]
}, {
city: 'b',
localities: [
{size: "small", zipcode: '12345', storeType: ['food', 'furniture']},
{size: "medium", zipcode: '12347', storeType: ['food']}]
}],
details: {
name: 'bar',
items: 500,
rating: 'low'}
}]var group = groupBy(vendors, ['addresses.localities.size'], ['id'])
// output gruop is
{
"small": {id: [1, 2]},
"medium": {id: [1, 2]},
"large": {id: [2]}
}```
## developing
Once you run
```npm install```then for running test
```npm run test```
to create build
```npm run build```
## license
This project is licensed under the terms of the MIT license.