69 lines
1.9 KiB
JavaScript
69 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// Read file paths from the command line.
|
|
const [,, arrayPath, objectPath, outputPath] = process.argv;
|
|
|
|
// Validate that first two parameters exist
|
|
if (!arrayPath || !objectPath) {
|
|
console.error('Usage: node mergeObjects.js <path-to-JSON-array> <path-to-JSON-object> [path-to-output.json]');
|
|
process.exit(1);
|
|
}
|
|
|
|
// The merge function, as provided
|
|
const mergeDeep = function(...objects) {
|
|
const isObject = obj => obj && typeof obj === 'object';
|
|
|
|
return objects.reduce((prev, obj) => {
|
|
Object.keys(obj).forEach(key => {
|
|
const pVal = prev[key];
|
|
const oVal = obj[key];
|
|
|
|
if (Array.isArray(pVal) && Array.isArray(oVal)) {
|
|
prev[key] = pVal.concat(...oVal);
|
|
}
|
|
else if (isObject(pVal) && isObject(oVal)) {
|
|
prev[key] = mergeDeep(pVal, oVal);
|
|
}
|
|
else {
|
|
prev[key] = oVal;
|
|
}
|
|
});
|
|
|
|
return prev;
|
|
}, {});
|
|
};
|
|
|
|
try {
|
|
// Read and parse the JSON from each file
|
|
const arrayData = JSON.parse(fs.readFileSync(path.resolve(arrayPath), 'utf-8'));
|
|
const objectData = JSON.parse(fs.readFileSync(path.resolve(objectPath), 'utf-8'));
|
|
|
|
// Ensure the first file's JSON is indeed an array
|
|
if (!Array.isArray(arrayData)) {
|
|
throw new Error('The first JSON file must contain an array of objects');
|
|
}
|
|
|
|
// Merge the second object into each element of the array
|
|
const mergedArray = arrayData.map(item => mergeDeep(item, objectData));
|
|
|
|
// If an outputPath is given, write the merged result there;
|
|
// otherwise, print to stdout.
|
|
if (outputPath) {
|
|
fs.writeFileSync(
|
|
path.resolve(outputPath),
|
|
JSON.stringify(mergedArray, null, 2),
|
|
'utf-8'
|
|
);
|
|
console.log(`Merged JSON saved to: ${outputPath}`);
|
|
} else {
|
|
console.log(JSON.stringify(mergedArray, null, 2));
|
|
}
|
|
|
|
} catch (err) {
|
|
console.error('Error reading or processing files:', err.message);
|
|
process.exit(1);
|
|
}
|