如何将数组中任意数量的对象合并为单个JavaScript对象?
解决方案
针对你的场景的核心实现
用Array.prototype.reduce就能完成合并,关键是设置正确的初始值,并在迭代中逐步合并每个元素的config对象:
const originalArray = [ { "config": { "holes": 18 } }, { "config": { "single_cart": false } }, { "config": { "shared_cart": false } }, { "config": { "caddie": false } }, { "config": { "transfers": false } }, { "config": { "meals": false } }, { "config": { "all_inclusive": false } } ]; const mergedResult = originalArray.reduce((acc, current) => { // 用展开运算符合并当前元素的config到累加器的config中 acc.config = { ...acc.config, ...current.config }; return acc; }, { config: {} }); // 初始值必须预设空的config对象,避免首次合并报错 console.log(mergedResult);
通用化适配(支持任意键名)
如果数组元素的键不是固定的config,而是任意动态键名,可改成遍历当前元素的所有键进行合并:
const mergedResult = originalArray.reduce((acc, current) => { for (const key in current) { // 若累加器中无当前键,先初始化空对象 if (!acc[key]) acc[key] = {}; // 合并当前键对应的子对象 acc[key] = { ...acc[key], ...current[key] }; } return acc; }, {});
你之前用reduce失败的常见原因
- 初始值设置错误:比如直接用
{}作为初始值,首次迭代时acc.config为undefined,展开会导致异常,必须预设目标键的空对象。 - 合并逻辑疏漏:没有正确将每个子对象的属性合并到同一个父键下,而是覆盖了整个父对象。
也可以用Object.assign替代展开运算符,效果完全一致:
acc.config = Object.assign({}, acc.config, current.config);
内容的提问来源于stack exchange,提问作者kalabo
相关产品推荐
相关产品推荐

