Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit71e8d56

Browse files
committed
Create JS utility that merges multiple objects into one, with an option for deep merging
0 parents  commit71e8d56

File tree

8 files changed

+3302
-0
lines changed

8 files changed

+3302
-0
lines changed

‎.babelrc‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"presets": ["@babel/preset-env"]
3+
}

‎.gitignore‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

‎README.md‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#mergeObjects Utility
2+
3+
The`mergeObjects` function is a utility for merging multiple objects into a single object, with an option to perform a deep merge. This function is particularly useful for combining configuration settings, state management, or any scenario where you need to consolidate multiple objects while preserving their properties.
4+
5+
##Installation
6+
7+
```
8+
npm install @webfactoryde/merge-objects
9+
```
10+
11+
##Usage
12+
13+
Import the`merge-objects` function in your module(s) and pass any number of objects:
14+
15+
```javascript
16+
// your module
17+
importdebouncefrom'@webfactoryde/merge-objects';
18+
19+
// Shallow merge:
20+
constobj1= { a:1, b:2 };
21+
constobj2= { b:3, c:4 };
22+
constresult=mergeObjects(obj1, obj2);
23+
console.log(result);// Output: { a: 1, b: 3, c: 4 }
24+
25+
// Deep merge
26+
constobj1= { a:1, b: { x:10, y:20 } };
27+
constobj2= { b: { y:30, z:40 }, c:4 };
28+
constresult=mergeObjects(true, obj1, obj2);
29+
console.log(result);// Output: { a: 1, b: { x: 10, y: 30, z: 40 }, c: 4 }
30+
```

‎jest.config.js‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
exportdefault{
2+
testEnvironment:'node',
3+
transform:{
4+
'^.+\\.jsx?$':'babel-jest',// Use Babel to transpile ES modules
5+
},
6+
moduleFileExtensions:['js','json','jsx','node'],
7+
};

‎package.json‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name":"@webfactoryde/merge-objects",
3+
"version":"1.0.0",
4+
"description":"JS Utility that merges multiple objects into one, with an option for deep merging",
5+
"main":"src/merge-objects.js",
6+
"type":"module",
7+
"devDependencies": {
8+
"@babel/core":"^7.28.3",
9+
"@babel/preset-env":"^7.28.3",
10+
"babel-jest":"^30.1.1",
11+
"jest":"^30.1.0"
12+
},
13+
"scripts": {
14+
"test":"jest"
15+
}
16+
}

‎src/merge-objects.js‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* Merges multiple objects into one, with an option for deep merging.
3+
*
4+
* Accepts either:
5+
* - mergeObjects(true, obj1, obj2, ...) // deep merge
6+
* - mergeObjects(obj1, obj2, ...) // shallow merge
7+
*
8+
*@param {...(boolean|Object)} args Boolean deep flag optionally first, then source objects.
9+
*@returns {Object} New merged object.
10+
*@throws {TypeError} If any provided source (after optional boolean) is not an object.
11+
*@see https://gomakethings.com/merging-objects-with-vanilla-javascript/#adding-a-deep-merge
12+
*/
13+
exportdefaultfunctionmergeObjects(...args){
14+
// Determine whether caller passed (deep, ...objects) or just (...objects)
15+
letdeep=false;
16+
letobjects=args;
17+
18+
if(typeofargs[0]==='boolean'){
19+
deep=args[0];
20+
objects=args.slice(1);
21+
}
22+
23+
constextended={};
24+
25+
// Validate
26+
for(constobjofobjects){
27+
if(typeofobj!=='object'||obj===null){
28+
thrownewTypeError('All arguments after the deep parameter must be objects.');
29+
}
30+
}
31+
32+
constmerge=(obj)=>{
33+
for(constpropinobj){
34+
if(Object.prototype.hasOwnProperty.call(obj,prop)){
35+
if(deep&&typeofobj[prop]==='object'&&obj[prop]!==null){
36+
extended[prop]=mergeObjects(true,extended[prop]||{},obj[prop]);
37+
}else{
38+
extended[prop]=obj[prop];
39+
}
40+
}
41+
}
42+
};
43+
44+
for(constobjofobjects){
45+
merge(obj);
46+
}
47+
48+
returnextended;
49+
}

‎tests/mergeObjects.test.js‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
importmergeObjectsfrom'../src/merge-objects';// Adjust the import path accordingly
2+
3+
describe('mergeObjects',()=>{
4+
test('should perform a shallow merge',()=>{
5+
constobj1={a:1,b:2};
6+
constobj2={b:3,c:4};
7+
constresult=mergeObjects(false,obj1,obj2);
8+
expect(result).toEqual({a:1,b:3,c:4});
9+
});
10+
11+
test('should perform a deep merge',()=>{
12+
constobj1={a:1,b:{x:10,y:20}};
13+
constobj2={b:{y:30,z:40},c:4};
14+
constresult=mergeObjects(true,obj1,obj2);
15+
expect(result).toEqual({a:1,b:{x:10,y:30,z:40},c:4});
16+
});
17+
18+
test('should perform a shallow merge when no deep arg is passed',()=>{
19+
constobj1={a:1,b:2};
20+
constobj2={b:3,c:4};
21+
constresult=mergeObjects(obj1,obj2);// No deep argument passed
22+
expect(result).toEqual({a:1,b:3,c:4});
23+
});
24+
25+
test('should throw an error if a non-object is passed',()=>{
26+
expect(()=>mergeObjects(true,{a:1},'not an object')).toThrow(TypeError);
27+
expect(()=>mergeObjects(false,{a:1},null)).toThrow(TypeError);
28+
expect(()=>mergeObjects(false,{a:1},42)).toThrow(TypeError);
29+
});
30+
31+
test('should handle more than two objects',()=>{
32+
constobj1={a:1};
33+
constobj2={b:2};
34+
constobj3={c:3};
35+
constresult=mergeObjects(false,obj1,obj2,obj3);
36+
expect(result).toEqual({a:1,b:2,c:3});
37+
});
38+
39+
test('should handle empty objects',()=>{
40+
constobj1={};
41+
constobj2={};
42+
constresult=mergeObjects(false,obj1,obj2);
43+
expect(result).toEqual({});
44+
});
45+
46+
test('should handle deep merge with empty objects',()=>{
47+
constobj1={a:1,b:{}};
48+
constobj2={b:{y:30},c:4};
49+
constresult=mergeObjects(true,obj1,obj2);
50+
expect(result).toEqual({a:1,b:{y:30},c:4});
51+
});
52+
});

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp