Documentation
object-match-maker
Create an object using data from two other objects. Get what you want from either objects and update what you want from either object. Returns a promise.
Node from developer:
Don’t Forget
Leave a star on github. Fork if necessary.
Install
npm install object-match-maker --save
const {ObjectMatchMaker} = require('object-match-maker');
File Structure
object-match-maker/
./index
./test/
./package.json
./README.md
Testing
node test test_1
Test from test_1 through test_8. And I added test_51 for kicks. Do not forget the underscore. If you don't add a test argument, it will default to test_51.
Syntax
ObjectMatchMaker(
obj = [{}, {}],
output_type=2,
get_values_from = 0,
this_is_the_rest = 0,
keys_to_update=[])
.then(res => {
console.log(res, ' from ', arg)
})
- obj is an array of the two objects that you want to work with.
- output_type - by default, OMM (object-match_maker) will output an array and an object. You can decide which one you want to work with by simply adding a second argument of 0 or 1 respectfully. 0 is to return an array, 1 is to return an object. 2 or any other values, including empty, is to return both. . Examples below.
- get_values_from - which element you want to get the value from. If you want to get the value from the first object or the second object. Examples below.
- this_is_the_rest - OMM mostly focus on similarities. The differences are largely disregarded. If you want the difference, regardless if it matches both objects or not, then you will apply a 0 or 1 to state where the rest of the data are coming from. Examples below.
- keys_to_update - just in case you may want to go deeper into the object to update specific keys instead of updating everything. This_is_the_rest and keys_to_update makes OMM very powerful and useful.
Uses Cases
Below, I will explain how to use each argument.
- Object a and an object b have different first level keys.
- Except for “ab”. There is a key “ab” on both objects.
- Very important. Because, most of the use cases are going to show you how to use Object Oriented to help create a new object that updates ab.
let a = {
aa: {
aaa: 1,
aab: 2,
aac: 3
},
ab: {
aaa: 4,
aab: 5,
aac: 6
},
ac: {
aaa: 7,
aab: 8,
aac: 9
},
}
let b = {
ba: {
aaa: 10,
aab: 11,
aac: 12
},
ab: {
aaa: 13,
aab: 14,
aac: 15
},
bc: {
aaa: 16,
aab: 17,
aac: 18
},
}
Case 1: argument 1, obj
node test test_1
- Imagine, object A was a newly created object.
- object B was coming from the database.
- And you do not want to override what is already on the database.
- You simply wanted to add the new data (a) to the existing data (b).
Here's the solution:
let c = ObjectMatchMaker([a,b])
console.log(c)
output:
[ [ { aaa: 13, aab: 14, aac: 15 },
{ aaa: 1, aab: 2, aac: 3 },
{ aaa: 7, aab: 8, aac: 9 } ],
{ ab: { aaa: 13, aab: 14, aac: 15 },
aa: { aaa: 1, aab: 2, aac: 3 },
ac: { aaa: 7, aab: 8, aac: 9 } }
]
case 2: argument 2, outputting an array only.
node test test_2
Do not panic.
- You just output the solution as an object and as an array.
- If you only want the object, you will simply add a second argument of 1
- and if you wanted only the array, you will add a second parameter of 0
- If you want both, you may leave it empty or add a second parameter of 2.
Let's run it again with a second argument of 0. This should output an array instead of array and object.
let c = ObjectMatchMaker([a,b],0)
console.log(c)
output:
[ { aaa: 13, aab: 14, aac: 15 },
{ aaa: 1, aab: 2, aac: 3 },
{ aaa: 7, aab: 8, aac: 9 } ]
case 3: output an object only.
node test test_3
- Let's say you wanted to output an object instead of an array.
- You will simply add a second argument of 1.
let c = ObjectMatchMaker([a,b],1)
console.log(c)
output:
{ ab: { aaa: 13, aab: 14, aac: 15 },
aa: { aaa: 1, aab: 2, aac: 3 },
ac: { aaa: 7, aab: 8, aac: 9 } }
I implemented this feature because I found myself needing either an object or an array. Depending on the circumstances. Hopefully, this feature will also help you.
Understanding the result
- The result, object c, should contain
- ab from object b.
- aa from object a
- ac from object a This is because object a is the new object and you may:
- Not want to override ab from object b.
- Object b may have additional information that object cannot pocess yet.
- Such as created_at.
- Or current_status.
- Or view_count
- Etc.
However, overriding object b should be your choice. Not mine. Therefore, I have implemented ways to override values from an object.
Case 4: get_values_from object “b”
From test script, run: node test test_4
Now, lets say, you only wanted to update object b. And you do not want to add new keys to it.
- This will mean that you will only take keys that match object a and object b.
- The rest of the keys from object that does not match object b will be disregarded.
- Remember, before you have took from b and add to a.
- This time, you will only take from a to update b.
- The rest of a, that does not match b, should be set aside.
For this solution, you will have to add a third argument of 0 or 1.
let c = ObjectMatchMaker([a,b],1,1)
console.log(c)
{ ab: { aaa: 4, aab: 5, aac: 6 },
ba: { aaa: 10, aab: 11, aac: 12 },
bc: { aaa: 16, aab: 17, aac: 18 } }
As you can see, ab is coming from object a. And ba, and bc is coming from object b.
- This argument is called, get_values_from.
- This is because we are getting values from B and we are updating B with object A.
- and we are disregarding the keys that do not match B.
Case 5: get_values_from object a
node test test_5
Instead of getting values from b, you may want to get value from a. Therefore, you will turn the third argument into a 0, instead of 1
- Object-match-maker actually returned a promise.
- Therefore, you can use "then" statement.
- This will run, after your object has been resolved.
ObjectMatchMaker([a, b], 0,0).then(output =>
console.log(output)
)
[ { aaa: 13, aab: 14, aac: 15 },
{ aaa: 1, aab: 2, aac: 3 },
{ aaa: 7, aab: 8, aac: 9 } ]
6 this_is_the_rest
From test script, run: node test test_6
- argument 4 is called, "this_is_the_rest" because it gets the rest of the keys, regardless if they matches.
- But, you have to tell it, where to get the rest of the keys from.
- Object a or b.
- based on the position of the first argument.
- Therefore, you will enter a 0 or 1.
ObjectMatchMaker([a, b], 1,0, 0).then(output =>
console.log(output)
)
{ ab: { aaa: 13, aab: 14, aac: 15 },
aa: { aaa: 1, aab: 2, aac: 3 },
ac: { aaa: 7, aab: 8, aac: 9 } }
- In this instance, case 6 does not have a significant difference.
- Because we are getting values from 0 and we want the rest of 0.
- We already have the rest of 0. Because we are getting values from 0.
- But, in case 7, you will see a big difference.
7 this_is_the_rest
node test test_7
If you wanted to get the key /value pair from object A, and get the rest of the values from B, You will add a fourth argument of 1
This make OMM very powerful. Here's why.
- Imagine, object C is meant to include all of object A and all of Object B.
- But, you want object A to be updated with keys that match object B.
- Hence., the existing data from the database will remain the same, but I want to add new data.
You can simply make object C includes data from A and B and update the data. let's run this.
ObjectMatchMaker([a, b], 1,0, 1).then(output =>
console.log(output)
)
{ ab: { aaa: 13, aab: 14, aac: 15 },
aa: { aaa: 1, aab: 2, aac: 3 },
ac: { aaa: 7, aab: 8, aac: 9 },
ba: { aaa: 10, aab: 11, aac: 12 },
bc: { aaa: 16, aab: 17, aac: 18 } }
-
First, notice we have 5 keys and not 6.
-
That is because AB was updated. And it was updated by AB from object B.
-
And also notice that all of the keys are blend into 1.
-
This is because we are getting already getting all the values from object and we said, we also want values from object b.
## 8 keys_to_update
node test test_8
- This is my favorite feature because we can update particular second level keys.
- Let's say, you do not want to update everything that matches a and b.
- You only wanted to update a few keys.
- For example, lets say, I want to update a key called updated_at, product_status.
- And every other 2nd level keys should not be updated.
- In this case, you will add a fifth argument that contains an array of the keys that must be updated.
let test_8 =[ [a, b], 1,0, 1, ['aaa', 'aac']]
ObjectMatchMaker(...test_8).then(res => {
console.log(res)
})
output:
{ ab: { aaa: 4, aab: 14, aac: 6 },
aa: { aaa: 1, aab: 2, aac: 3 },
ac: { aaa: 7, aab: 8, aac: 9 },
ba: { aaa: 10, aab: 11, aac: 12 },
bc: { aaa: 16, aab: 17, aac: 18 } }
Play with it. Have fun with it. I am pretty sure, you will find what you want from it. Good luck.
Full Test Script
const {ObjectMatchMaker, omm} = require('./index');
let a = {
aa: {
aaa: 1,
aab: 2,
aac: 3
},
ab: {
aaa: 4,
aab: 5,
aac: 6
},
ac: {
aaa: 7,
aab: 8,
aac: 9
},
}
let b = {
ba: {
aaa: 10,
aab: 11,
aac: 12
},
ab: {
aaa: 13,
aab: 14,
aac: 15
},
bc: {
aaa: 16,
aab: 17,
aac: 18
},
}
let test_51 =[ [a, b], 0,0, 1, ['aaa', 'aac']]
let test_1 =[ [a, b]]
let test_2 =[ [a, b], 0]
let test_3 =[ [a, b], 1]
let test_4 =[ [a, b], 1,1]
let test_5 =[ [a, b], 0,0]
let test_6 =[ [a, b], 1,0, 0]
let test_7 =[ [a, b], 1,0, 1]
let test_8 =[ [a, b], 1,0, 1, ['aaa', 'aac']]
let object = {
test_1, test_2, test_3, test_4, test_5, test_6, test_7, test_8, test_51
}
let arg = process.argv.slice(2)[0]
if(!arg){
arg = 'test_51'
console.log('you must include test detail from test_1 to test_8. Do not forget the underscores. Therefore, I am outputting a test file but it is not the exact one you are looking for')
}
ObjectMatchMaker(...object[arg]).then(res => {
console.log(res, ' from ', arg)
})
Change Log
2.1.3
- Added bullet list for readability
2.1.2
- include change log
- update README.md, fix some grammar.