GitHub - f/honst: Fixes your dataset according to your rules.
source link: https://github.com/f/honst
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
honst
The name: I wanted it to be "honest", but it was occupied, so I removed a letter, and it became "honst".
Data Integrity fixer for an object matrix.
Use Cases
- On editing a joined matrix data needs the data integrity to be kept.
- Keeping your local state correct.
You can play with honst on CodeSandbox:
Overview
const data = [ { username: "johndoe", name: "John", surname: "Doe", age: "22" }, { username: "johndoe", name: "John", surname: "Doe", age: "25" }, { username: "johndoe2", name: "John", surname: "Doe", age: "22" }, { username: "johndoe2", name: "John", surname: "Doez", age: "22" }, ]
According to username
field, there are many integrity issues around the array. So let honst fix these:
[ { username: "johndoe", name: "John", surname: "Doe", age: 22 }, - { username: "johndoe", name: "John", surname: "Doe", age: 25 }, + { username: "johndoe", name: "John", surname: "Doe", age: 22 }, { username: "johnapple", name: "John", surname: "Apple", age: 29 }, - { username: "johnapple", name: "John", surname: "Orange", age: 22 }, + { username: "johnapple", name: "John", surname: "Apple", age: 29 }, ]
- Referencing to
data[0].username
,name
,surname
, andage
should beJohn
,Doe
and22
. - But
data[1].age
is25
and it should be fixed. - Referencing to
data[3].username
,name
,surname
, andage
should beJohn
,Apple
and29
. - But
data[1].age
is25
,data[1].surname
isOrange
and these should be fixed as well.
honst simply fixes these integirty issues.
Usage
Install using npm
or yarn
:
npm install honst
# or
yarn add honst
Now you can start:
import { honst } from 'honst'; const { data, delta } = honst({ data: [ { username: "johndoe", name: "John", surname: "Doe", age: "22" }, { username: "johndoe", name: "John", surname: "Doe", age: "25" } ], pivot: 0, // an index number, "scan" or "reverse-scan" delta: true, // boolean rules: { // the ruleset of integrity // e.g. we want all names, surnames and ages to be same according to "username" name: ["username"], surname: ["username"], age: ["username"], } })
This will generate following data:
const fixedData = { data: [ { username: "johndoe", name: "John", surname: "Doe", age: "22" }, { username: "johndoe", name: "John", surname: "Doe", age: "22" }, ], delta: [ { candidatePath: "age", // the path of the field falseValue: "25", // the wrong value candidateValue: "22", // the candidate value pivot: 0, // the pivot row index candidateIndex: 1, // the false row index } ] }
Scanning and Reverse Scanning
Just pass pivot
value scan
or reverse-scan
.
If you want to fix all the rows from top-down or bottom-up, this will scan the data and fix'em all.
const { data, delta } = honst({ data: [ { username: "johndoe", name: "John", surname: "Doe", age: "22" }, { username: "johndoe", name: "John", surname: "Doe", age: "25" }, { username: "johndoe2", name: "John", surname: "Doe", age: "22" }, { username: "johndoe2", name: "John", surname: "Doez", age: "22" }, ], pivot: "scan", delta: true, rules: { name: ["username"], surname: ["username"], age: ["username"], } })
This will generate the following:
const fixedData = [ { username: "johndoe", name: "John", surname: "Doe", age: "22" }, { username: "johndoe", name: "John", surname: "Doe", age: "22" }, { username: "johndoe2", name: "John", surname: "Appleseed", age: "22" }, { username: "johndoe2", name: "John", surname: "Appleseed", age: "22" }, ]
If you select scan
the upper rows will be fixed first, and matching
rows below will be updated accordingly. If you select reverse-scan
it'll start fixing from bottom
and scan to the top, so the bottom rows will be assumed correct.
Nested Objects?
Yes it supports nested objects as well.
const { data, delta } = honst({ data: [ // ... some nested data ], rules: { 'user.name': ["account.username"], 'user.surname': ["account.username"], 'profile.age': ["account.username"], } })
Contribution
- Clone and edit the source as you wish.
- Please do not forget to add tests.
- Write a descriptive PR.
License
This project uses MIT license.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK