{"_id":"json-reduce","_rev":"3-2ea92191116068611613ec4026b7abaf","name":"json-reduce","description":"Reduce any JSON value by traversing depth first and visiting each node","dist-tags":{"latest":"3.0.0"},"versions":{"1.0.0":{"name":"json-reduce","version":"1.0.0","main":"dist/reduce.js","scripts":{"start":"node -r babel-register example.js","test":"flow check && eslint src","prepublish":"babel src --out-dir dist"},"keywords":[],"author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"license":"MIT","description":"## Reduce a json tree by visiting each node","dependencies":{},"devDependencies":{"babel-cli":"^6.26.0","babel-core":"^6.18.2","babel-eslint":"^7.1.0","babel-plugin-syntax-class-properties":"^6.13.0","babel-plugin-syntax-object-rest-spread":"^6.13.0","babel-plugin-transform-class-properties":"^6.19.0","babel-plugin-transform-object-rest-spread":"^6.19.0","babel-plugin-transform-flow-comments":"^6.22.0","babel-preset-env":"^1.6.0","empty":"^0.10.1","eslint":"^4.5.0","eslint-config-prettier":"^2.3.0","eslint-config-sanity":"^2.1.4","eslint-config-standard":"^10.2.1","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-import":"^2.7.0","eslint-plugin-node":"^5.1.1","eslint-plugin-prettier":"^2.2.0","eslint-plugin-promise":"^3.5.0","eslint-plugin-standard":"^3.0.1","flow-bin":"^0.54.1","prettier":"^1.6.1"},"gitHead":"445b9ad890f0326757c823695e385770252b8eed","_id":"json-reduce@1.0.0","_npmVersion":"5.4.1","_nodeVersion":"8.3.0","_npmUser":{"name":"bjoerge","email":"bjoerge@gmail.com"},"dist":{"integrity":"sha512-UYqT1LHC3asUt1hiSjz+ikPUHq6SWHBQHrRvRblD6RTQisgw9nKEOa79OYgJXDIHb9Z92EyIno4DslNWwSm1hQ==","shasum":"7b9355e85369869e51983ba5d7051cbef324e1ec","tarball":"https://registry.npmjs.org/json-reduce/-/json-reduce-1.0.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCim/OQplHd2S7Nep8fnE/5pXK45ytMyvwgCxN0xrm7mAIhANh20j9MsadVzgKZp1akZwAVKDlzEEhWarjQEyyK2H0Q"}]},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/json-reduce-1.0.0.tgz_1505243272821_0.8795401197858155"},"directories":{}},"2.0.0":{"name":"json-reduce","version":"2.0.0","main":"dist/reduce.js","scripts":{"start":"node -r babel-register example.js","test":"jest test/*.test.ts && npm run type-check","lint":"eslint src --ext .ts","build":"tsc --emitDeclarationOnly && babel src --out-dir dist --extensions \".ts,.tsx\"","type-check":"tsc src/* --noEmit","prepublish":"npm run build"},"keywords":[],"author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"license":"MIT","description":"Reduce any JSON value by traversing depth first and visiting each node","dependencies":{},"devDependencies":{"@babel/cli":"^7.0.0-rc.1","@babel/core":"^7.0.0-rc.1","@babel/preset-env":"^7.0.0-rc.1","@babel/preset-typescript":"^7.0.0-rc.1","@types/jest":"^23.3.1","babel-jest":"^23.4.2","jest":"^23.5.0","prettier":"^1.14.2","ts-jest":"^23.1.3","typescript":"^3.0.1"},"directories":{"test":"test"},"repository":{"type":"git","url":"git+https://github.com/bjoerge/json-reduce.git"},"bugs":{"url":"https://github.com/bjoerge/json-reduce/issues"},"homepage":"https://github.com/bjoerge/json-reduce#readme","gitHead":"424cfc1b284aff0dfb6c729b1e45bb5479a1ae56","_id":"json-reduce@2.0.0","_npmVersion":"6.3.0","_nodeVersion":"8.11.2","_npmUser":{"name":"bjoerge","email":"bjoerge@gmail.com"},"dist":{"integrity":"sha512-qHVKlo1O0gbDw9rBUGVOKocopfdDTwVjeAyuO8Oatg58sTD8rqM4Hp6MyYZIsta36QXHjL4sagT8/Nn52cHs8Q==","shasum":"c5529625eb1096c05f912a56dca264d53459c685","tarball":"https://registry.npmjs.org/json-reduce/-/json-reduce-2.0.0.tgz","fileCount":14,"unpackedSize":22354,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbeCyZCRA9TVsSAnZWagAAR0UP+wQWpDVZNo+v4uTjEyjI\nqI/wvjmK7wwmc+wXQ9fxo6Nld76100UeVcE38SCtKRTnyCWg3GXfKsX+HkIq\n0vNIjzdhWPRY66nJwn/Pq33ONQBQ5u6bidad7nwe8p2u6y01uAFK4gZJJIMt\nmtKgUoLD8LCMETV8a10ZZRkSmWstWdQRRUFBZIAJEeLeXSDBkzGU1XFETVbq\nsMA1BvN6UBMT8CdiGn85S3UheQsSF3Hfz4DnjszCTbQazv5m/MntVcodTB+U\nJDZDIq/04zBIfnzFh1va5v6xZ0uZEvVQcGi04Y9PXCZWvGVX/2n8jHib95fS\nHEhKy/Ui48IMNNHecsasd0uyPEkmBs63E1P4bt1tCoYxY9nZ2SvXHcf0lHW3\nRrzkuSSXT6x0hAGAkqWGYF2+piAXFu1mGJgiHlykXJVCjsOEqwT0TOz2xzAr\n9kV2bOvPLq8Dgilcz7gC6ZZ0P9ExpgkRH9/21t/kHPBhN7IUhmpuTfB1y23U\n70kzVfWFoDNfCzf77NNgo8iYqwv8vtuN4SPd5IPf3WAqky1jDuEORqdEk7CW\nzRxEryVfI2K0OYqSjtTQazhjmW3WcFCfrXDU/8unQsVSCBWDXr6KGSCATcSD\nUj/WHTJwJ+8dHg3xTevKXsWFXtPrjU49A+OraarkNo5pbqs3iavGELeQd24Q\neR3j\r\n=yBv1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAQMTyiWHhty4Vg4L9WZrSgVaJZhfyMpXR0+iNiQU+G3AiBhWO6VzX0mlBLPOFoKy3Q80JuNB3UmELD+hXfBc+nPhg=="}]},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/json-reduce_2.0.0_1534602392974_0.8427455559125996"},"_hasShrinkwrap":false},"3.0.0":{"name":"json-reduce","version":"3.0.0","main":"dist/reduce.js","scripts":{"start":"node -r babel-register example.js","test":"jest test/*.test.ts && npm run type-check","lint":"eslint src --ext .ts","build":"tsc --emitDeclarationOnly && babel src --out-dir dist --extensions \".ts,.tsx\"","type-check":"tsc src/* --noEmit","prepublish":"npm run build"},"keywords":[],"author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"license":"MIT","description":"Reduce any JSON value by traversing depth first and visiting each node","dependencies":{},"devDependencies":{"@babel/cli":"^7.0.0-rc.1","@babel/core":"^7.0.0-rc.1","@babel/preset-env":"^7.0.0-rc.1","@babel/preset-typescript":"^7.0.0-rc.1","@types/jest":"^23.3.1","babel-jest":"^23.4.2","jest":"^23.5.0","prettier":"^1.14.2","ts-jest":"^23.1.3","typescript":"^3.0.1"},"directories":{"test":"test"},"repository":{"type":"git","url":"git+https://github.com/bjoerge/json-reduce.git"},"bugs":{"url":"https://github.com/bjoerge/json-reduce/issues"},"homepage":"https://github.com/bjoerge/json-reduce#readme","types":"./dist/reduce.d.ts","gitHead":"363375a44f7450390c36707ec743b7bb238c4028","_id":"json-reduce@3.0.0","_nodeVersion":"16.13.1","_npmVersion":"8.2.0","dist":{"integrity":"sha512-zvnhEvwhqTOxBIcXnxvHvhqtubdwFRp+FascmCaL56BT9jdttRU8IFc+Ilh2HPJ0AtioF8mFPxmReuJKLW0Iyw==","shasum":"3aadf4c69f7435ed12427aec68cf931d3aaa3561","tarball":"https://registry.npmjs.org/json-reduce/-/json-reduce-3.0.0.tgz","fileCount":14,"unpackedSize":22349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGKKYS+NzKl0UE2fYfl3MLdmP4rJo3m8qcu1WlTZP5ikAiBP72XLx2SwTGFDJfa7ejkuJNk5lxbbjDZYJq4CJfuofg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjPuWVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsAA/+LaV5eanCP06RWS2OSnHC+4WcAqFfDuF8LZdOomMFnz3Gsv4c\r\njaSdfuKWI4h0UwUB6zsMCilotaf6JPmYJ6XJ6pBUmOMw4s/zegNVnUj11JW9\r\nZp+/H0/i5iBNbpyJdjPHr24iyyXudiFam3KlOqIGkYylpefireecNamZapTf\r\n4fJnKxg6RNeZzHstMa1yIEnroLzynyI1fOT5gu81cEryCUE6w8wBo6QMKHp0\r\ntptb/awKA0Ut6wJJ1li7DrbPDY6oSllIypibp5LUQlGHCKFdVy6GOcAaEg9L\r\n/m6zIOjn2lcsIAm4/VZ8bjN/zkbfbvyocckUmOE47IltOb2/VgvGisUkpNR3\r\n/yYEPgp+Dtelv+ADjxBDc8r9KJVbgsuIwM4DBTkNIgWazCYiAHNzi0Di8NDJ\r\n5ASz7sG4IID+EwgOgGeMuh9sU/DXovUPbh/m5aLNrnuSlTKWkAi8oVfd6sII\r\n+1LQ/HAY2JJGxCPrcrQuQztilbhY3mbXnf6WsA0nggRepForS5LEYNPw/cqo\r\np5coBtwehnhvhqaTy+ge625wRHj656t/hBy10zQvMjocDTYLeDGPyboY/wuX\r\nyWphxAwqDILp2mwZO9n7ictq6eUZ6tzm9aUOCI1gtFzPLzQ7wLvF4dU8WEf0\r\nDXFPullnvWnQhS30s7LMN0ZsT5WB+FjB2fQ=\r\n=qaKM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"bjoerge","email":"bjoerge@gmail.com"},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/json-reduce_3.0.0_1665066389018_0.9037175436898732"},"_hasShrinkwrap":false}},"readme":"# json-reduce\n\n> Reduce any JSON value by traversing depth first and visiting each node\n\n## Example: calculate the sum of all number values in a json object\n```js\nimport {reduce} from 'json-reduce'\n\nconst document = {\n  first: 1,\n  second: 2,\n  deep: {\n    array: [3, 4, 5, 6],\n    seven: 7\n  }\n}\n\nconst result = reduce(\n  document,\n  (acc, value, path) => (typeof value === 'number' ? acc + value : acc),\n  0\n)\n\nconsole.log(result)\n//=> 28\n```\n\n## API\n```\nreduce(value, reducer, initialValue)\n````\n\n`reducer` is the reducer function to execute for each node in the tree, and is given three arguments:\n\n  - `accumulator` - The accumulation of the callback's return values; it is the value returned\n  from the previous invocation of the callback, or `initialValue`.\n  - `value` - The current node being traversed\n  - `path` - The \"dot-path\" to the current node being traversed, e.g. `['deep', 'array', 2]`\n\n## Skipping subtrees\nSometimes when encountering a specific object or array value, you want to skip traversing the subtree. This can be done calling\na provided SKIP function like this:\n\n```js\nimport reduce, {SKIP} from 'json-reduce'\n\nconst doc = {\n  species: [\n    {name: 'clover', type: 'plant'},\n    {name: 'trout', type: 'fish', eats: [{type: 'animal', name: 'crayfish'}]},\n    {\n      type: 'animal',\n      name: 'bear',\n      food: [\n        {\n          type: 'animal',\n          name: 'deer',\n          food: [{type: 'plant', name: 'leaves'}]\n        },\n        {\n          type: 'plant',\n          name: 'blueberry'\n        }\n      ]\n    }\n  ]\n}\n\nconst result = reduce(\n  doc,\n  (acc, val, path) => {\n    if (val.type === 'plant' || val.type === 'fish') {\n      // We don't want to traverse the subtrees of these\n      return SKIP\n    }\n    // Collect all traversed paths\n    return acc.concat([path])\n  },\n  []\n)\nexpect(result).toEqual([\n  [],\n  ['species'],\n  ['species', 2],\n  ['species', 2, 'type'],\n  ['species', 2, 'name'],\n  ['species', 2, 'food'],\n  ['species', 2, 'food', 0],\n  ['species', 2, 'food', 0, 'type'],\n  ['species', 2, 'food', 0, 'name'],\n  ['species', 2, 'food', 0, 'food']\n])\n```\n\n## Return and skip\nIn addition to return `SKIP`, you can also call SKIP with a return value for convenience, to both return the accumulated\nvalue and signal subtree skipping in one operation, e.g.:\n\n```js\n//\nreduce(doc, (acc, node) => {\n  if (node.type === 'plant' || node.type === 'fish') {\n    // Uppercase plant and fish names, but skip traversing subtrees\n    return SKIP(\n      acc.concat({\n        ...node,\n        name: node.name.toUpperCase()\n      })\n    )\n  }\n  return acc\n}, [])\n```\n\n## Gotchas / Limitations\n- Initial value _is required_. json-reduce does not work like [Array.prototype.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) with respect to missing initial value\n- No circular reference detection and handling. Passing a circular structure to `reduce()` will probably crash with maximum call stack size exceeded.\n- Assumes a data structure that consists of valid JSON data types only. Traversal of `Map`, `Set`, etc. are not currently supported (PR welcome!).\n","maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"time":{"modified":"2022-10-06T14:26:29.241Z","created":"2017-09-12T19:07:53.723Z","1.0.0":"2017-09-12T19:07:53.723Z","2.0.0":"2018-08-18T14:26:33.025Z","3.0.0":"2022-10-06T14:26:29.161Z"},"keywords":[],"author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"license":"MIT","readmeFilename":"README.md","homepage":"https://github.com/bjoerge/json-reduce#readme","repository":{"type":"git","url":"git+https://github.com/bjoerge/json-reduce.git"},"bugs":{"url":"https://github.com/bjoerge/json-reduce/issues"}}