{"id":21446325,"url":"https://github.com/oskang09/digdata","last_synced_at":"2025-07-14T19:31:17.720Z","repository":{"id":35114022,"uuid":"204134531","full_name":"Oskang09/digdata","owner":"Oskang09","description":"lightweight zero dependency object data utility","archived":false,"fork":false,"pushed_at":"2023-08-08T08:13:57.000Z","size":393,"stargazers_count":4,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-03T18:10:12.488Z","etag":null,"topics":["digdata","javascript"],"latest_commit_sha":null,"homepage":"https://oskang09.github.io/digdata/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Oskang09.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-24T09:08:05.000Z","updated_at":"2023-08-08T08:14:08.000Z","dependencies_parsed_at":"2023-01-15T14:06:38.530Z","dependency_job_id":null,"html_url":"https://github.com/Oskang09/digdata","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Oskang09/digdata","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oskang09%2Fdigdata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oskang09%2Fdigdata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oskang09%2Fdigdata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oskang09%2Fdigdata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Oskang09","download_url":"https://codeload.github.com/Oskang09/digdata/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oskang09%2Fdigdata/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265336316,"owners_count":23749176,"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":["digdata","javascript"],"created_at":"2024-11-23T02:42:48.319Z","updated_at":"2025-07-14T19:31:17.423Z","avatar_url":"https://github.com/Oskang09.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Suggestion\n\nIf your codebase is support [Optional Chaining](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining), i will suggest you to use that unless you have some excuse to use like, large access to single object and want to use \"cursor\" to make it faster. Since native supported should have better performance than this library.\n\n# Installation\n\n### Node\n\n```js\n{\n    \"dependencies\": {\n        \"digdata\": \"Oskang09/digdata#1.1.2\",\n    },\n}\n```\n\n### Browser\n\n```js\n// latest version from master branch\n\u003cscript src=\"https://oskang09.github.io/digdata/index.min.js\"\u003e\u003cscript\u003e\n\n// specific version 1.1.0 ( browser support start from 1.1.0 )\n\u003cscript src=\"https://oskang09.github.io/digdata/versions/1.1.2/index.min.js\"\u003e\u003cscript\u003e\n```\n\n# Example \u0026 Ussage\n\n### Comma Symbol\n\nComma symbols `','` is for receiving multiple from an object. etc.\n\n```javascript\nconst { dig } = require('digdata');\nconst object = {\n    price: 26.8,\n    count: 2,\n    name: 'A4 Paper',\n    buyer: [\n        {\n            name: 'Oska',\n            id: 1,\n            age: 14\n        },\n        {\n            name: 'Jason',\n            id: 2,\n            age: 12\n        }\n    ]\n};\n\ndig(object, 'price,name'); // { \"price\": 26.8, \"name\": \"A4 Paper\" }\ndig(object, 'buyer.*.name,age') // [ { \"name\": \"Oska\", \"age\": 14 }, { \"name\": \"Jason\", \"age\": 12 }]\n```\n\n### Equal Symbol\n\nEqual symbols `'='` is for receive based on value from an object or array. etc.\n\n```javascript\nconst { dig } = require('digdata');\nconst object = {\n    type: 'SPICY',\n    name: 'Burger',\n    dine: [\n        'DINE_IN',\n        'TAKEAWAY'\n    ],\n    variants: [\n        {\n            name: 'Ala Carte',\n            price: 8.9,\n            items: [ 'Burger' ],\n        },\n        {\n            name: 'Large Set',\n            price: 11.9,\n            items: [\n                'Burger',\n                'French Fries',\n                'Coca Cola'\n            ],\n        },\n    ],\n};\n\ndig(object, 'variants.name=Ala Carte'); // { \"name\": \"Ala Carte\", \"price\": 8.9, \"items\": [ \"Burger\" ] }\ndig(object, 'dine=DINE_IN'); // \"DINE_IN\"\n```\n\n### ArrayMap Symbol\n\nArrayMap symbols `'*'` is for filter data from an array object. etc.\n\n```javascript\nconst object = {\n    owner: {\n        id: 14,\n        name: 'Jason',\n        age: 19\n    },\n    users: [\n        {\n            id: 1,\n            name: 'Oskang09',\n            age: 20,\n            email: 'developer.oskang@gmail.com',\n        },\n        {\n            id: 2,\n            name: 'Roger',\n            age: 24,\n        }\n    ]\n};\n\ndig(object, 'users.*.name'); // [ 'Roger', 'Oskang09' ]\ndig(object, 'users.*.name,id') // [ { \"name\": \"Oskang09\", \"id\": 1 }, { \"name\": \"Roger\", \"id\": 2 }]\n```\n\n### Result as Array / Object\n\nYou can make your result as object or array. etc.\n\n```javascript\nconst { dig } = require('digdata');\nconst object = {\n    class: 'LECTURE',\n    students: [\n        {\n            id: 1,\n            name: 'Oska'\n        },\n        {\n            id: 2,\n            name: 'WangLin',\n        },\n        {\n            id: 3,\n            name: \"Yuzy\"\n        }\n    ],\n};\n\ndig(object, { classType: 'class', studentNames: 'students.*.name' }); // { \"classType: \"LECTURE\", studentNames: [ \"Oska\", \"WangLin\", \"Yuzy\" ] }\ndig(object, [ \"class\", \"students.id=3.name\" ]); // [ 'LECTURE', 'Yuzy' ]\n```\n\n### Pipe Symbol\n\nPipe symbol `|` is for taking first truth value form object. etc\n\n```javascript\nconst { dig } = require('digdata'); \nconst object = {\n    name: 'Oska',\n    job: 'Developer',\n};\n\ndig(object, 'address|name|job'); // Oska\ndig(object, 'address|job|name'); // Developer  \n```\n\n### Invoke Symbol\n\nInvoke symbol `\u0026` is for assigning formatter function for value. You can set formatter globally by using method `setFormatter(formatter)` before any `dig` have invoked.\n\n```javascript\nconst { dig, setFormatter } = require('digdata');\nconst formatter = {\n    moment: function (value, object) {\n        return Date.parse(value);\n    }\n};\n\nconst object = {\n    createdAt: '12 Dec 2019 00:12:00 GMT',\n    updatedAt: '12 Mac 2020 00:12:00 GMT'\n};\n\nlet newObject = dig(object, { createdAt: 'createdAt\u0026moment', updatedAt: 'updatedAt\u0026moment' }, undefined, formatter);\nconsole.log(typeof newObject.createdAt); // number\nconsole.log(typeof newObject.updatedAt); // number\n\nsetFormatter(formatter);\nnewObject = dig(object, { createdAt: 'createdAt\u0026moment', updatedAt: 'updatedAt\u0026moment' });\nconsole.log(typeof newObject.createdAt); // number\nconsole.log(typeof newObject.updatedAt); // number\n```\n\n### Custom symbols\n\nYou can override it by using `setOptions(newOpts)` method.\n\n```javascript\nconst { dig, setOptions } = require('digdata');\n// just change whatever you want and it's using assign so unassigned value will use default.\nsetOptions({\n    seperator: '-\u003e',\n    // comma: ',',\n    // equal: '=',\n    // arrayMap: '*',\n    // pipe: '|',\n    // invoke: '\u0026',\n});\n\nconst object = {\n    update: {\n        options: 'OK'\n    }\n};\n\ndig(object, 'update-\u003eoptions'): // 'OK'\n```\n\n### Caching Cursor\n\nUsually complex object we will have more than on operation on object and geting different key or array fields. so the idea is cache every single node accessing and store the object we access, when same key is exists will get the object directly instead search through whole object again. Of course single layer object is not required with this features.\n\n```javascript\nconst { dig, cursor: buildCursor } = require('digdata');\n\nconst object = {\n    owner: {\n        id: 14,\n        name: 'Jason',\n        age: 19,\n        client: {\n            name: 'Yuzy',\n            job: \"Student\",\n        },\n        users: [\n            {\n                id: 1,\n                name: 'Oskang09',\n                age: 20,\n                email: 'developer.oskang@gmail.com',\n            },\n            {\n                id: 2,\n                name: 'Roger',\n                age: 24,\n                special: true,\n            }\n        ],\n    },\n    community: [\n        'Oskang09',\n        'Roger',\n        'Jason'\n    ]\n};\n\n// you can pass previous cached cursor as first params\n// custom options / symbols as second params\n// we always encourage using same options for same object\nconst options = buildCursor(); \n\n// build cache \"owner\"\nconst a = dig(object, \"owner\", options);\n\n// from cache \"owner\"\n// build cache \"owner.id\"\nconst b = dig(object, \"owner.id\", options); \n\n// from cache \"owner\"\n// build cache \"owner.client\"\n// build cache \"owner.client.name\"\nconst c = dig(object, \"owner.client.name\", options); \n\n// from cache \"owner.client\"\n// build cache \"owner.client.job\"\nconst d = dig(object, \"owner.client.job\", options);\n\n// from cache \"owner\"\n// build cache \"owner.users\"\n// build cache \"owner.users.*\"\n// build cache \"owner.users.*.name\"\nconst e = dig(object, \"owner.users.*.name\", options);\n\n// from cache \"owner.users.*\"\n// build cache \"owner.users.*.id\"\nconst f = dig(object, \"owner.users.*.id\", options);\n\n// from cache \"owner.users.*\"\n// build cache \"owner.users.*.special\"\nconst g = dig(object, \"owner.users.*.special\", options);\n\n// from cache \"owner.users\"\n// build cache \"owner.users.name=Oskang09\"\nconst h = dig(object, \"owner.users.name=Oskang09\", options);\n\n// from cache \"owner.users.name=Oskang09\"\n// build cache \"owner.users.name=Oskang09.age\"\nconst i = dig(object, \"owner.users.name=Oskang09.age\", options);\n\n// you will see how cache json look likes, there also an example.\nconsole.log(options.cursor);\n```\n\nExample cache json look like.\n\n```javascript\n{\n  owner: {\n    id: 14,\n    name: 'Jason',\n    age: 19,\n    client: { name: 'Yuzy', job: 'Student' },\n    users: [ [Object], [Object] ]\n  },\n  'owner.id': 14,\n  'owner.client': { name: 'Yuzy', job: 'Student' },\n  'owner.client.name': 'Yuzy',\n  'owner.client.job': 'Student',\n  'owner.users': [\n    {\n      id: 1,\n      name: 'Oskang09',\n      age: 20,\n      email: 'developer.oskang@gmail.com'\n    },\n    { id: 2, name: 'Roger', age: 24, special: true }\n  ],\n  'owner.users.*': [\n    {\n      id: 1,\n      name: 'Oskang09',\n      age: 20,\n      email: 'developer.oskang@gmail.com'\n    },\n    { id: 2, name: 'Roger', age: 24, special: true }\n  ],\n  'owner.users.*.name': [ 'Oskang09', 'Roger' ],\n  'owner.users.*.id': null,\n  'owner.users.*.special': null,\n  'owner.users.name=Oskang09': {\n    id: 1,\n    name: 'Oskang09',\n    age: 20,\n    email: 'developer.oskang@gmail.com'\n  },\n  'owner.users.name=Oskang09.age': 20\n}\n```\n\n# Test \u0026 Coverages\n\n```\n PASS  ./index.test.js\n  √ Should dot string notation accepted. (3ms)\n  √ Should object dot string notation accepted.\n  √ Should array dot string notation accepted. (1ms)\n  √ Should equal symbol return object if target is array object based on condition.\n  √ Should equal symbol return array if target is array based on condition.\n  √ Should equal symbol return null when target not exists. (1ms)\n  √ Should arrayMap symbol return specific key\n  √ Should comma symbol work with arrayMap symbol return multiple keys\n  √ Should pipe symbol return first truth value (1ms)\n  √ Should return null if target exists.\n  √ Should return null if object is falsy value.\n  √ Should run invoke if function and data found. (1ms)\n  √ Should skip if function not found.\n  √ Should `cursor` build options object\n  √ Should build cache when cursor not null\n  √ Should get from cache when cursor not null and key exist (1ms)\n  √ Should `withOptions` set disableTracker on options\n  √ Should `setOptions` update options object.\n\n----------|---------|----------|---------|---------|-------------------\n| File       | % Stmts   | % Branch   | % Funcs   | % Lines   | Uncovered Line #s   |\n| ---------- | --------- | ---------- | --------- | --------- | ------------------- |\n| All files  | 100       | 95.83      | 100       | 100       |\n| index.js   | 100       | 95.83      | 100       | 100       | 155,159             |\n| ---------- | --------- | ---------- | --------- | --------- | ------------------- |\nTest Suites: 1 passed, 1 total\nTests:       18 passed, 18 total\nSnapshots:   0 total\nTime:        1.562s\nRan all test suites.\n```\n\n# Maintainers \u0026 Contributors\n\n- [Oskang09](https://github.com/Oskang09)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foskang09%2Fdigdata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foskang09%2Fdigdata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foskang09%2Fdigdata/lists"}