如何合并含额外属性的两个对象并更新记录总数
合并包含统计属性的JavaScript对象
我需要合并两个结构相似的JavaScript对象,每个对象都包含items数组以及count、total_records、offset、has_more这些额外属性。尝试过直接用concat处理items数组,但没法同步更新统计属性。期望合并后的对象不仅拼接items数组,还要把count和total_records更新为合并后items的总数量,同时保留其他属性(比如示例中offset保持500,has_more保持false)。
示例输入:
const obj1 = { items: [ { content_sys_id: "15b9d20b87941d10f2d740c8dabb35f1" }, { content_sys_id: "009e86a787dc5d10f2d740c8dabb35c8" }, { content_sys_id: "21f5b2d597a151d0da8bd714a253af44" }, ], count: 3, total_records: "3", offset: 500, has_more: false, }; const obj2 = { items: [ { content_sys_id: "002301478788d15038a740c8dabb350e" }, { content_sys_id: "cb895ec787941d10f2d740c8dabb357e" }, ], count: 2, total_records: "2", offset: 500, has_more: false, };
期望输出:
{ items: [ { content_sys_id: "15b9d20b87941d10f2d740c8dabb35f1" }, { content_sys_id: "009e86a787dc5d10f2d740c8dabb35c8" }, { content_sys_id: "21f5b2d597a151d0da8bd714a253af44" }, { content_sys_id: "002301478788d15038a740c8dabb350e" }, { content_sys_id: "cb895ec787941d10f2d740c8dabb357e" }, ], count: 5, total_records: "5", offset: 500, has_more: false, }
实现方案
可以通过创建新对象,手动拼接items数组并计算更新统计属性,同时复制需要保留的其他属性。以下是具体实现:
合并两个对象的函数
function mergeResultObjects(objA, objB) { // 拼接items数组,避免修改原数组 const mergedItems = [...objA.items, ...objB.items]; // 计算合并后的总记录数 const totalCount = mergedItems.length; // 返回合并后的对象,可按需调整属性取值逻辑 return { items: mergedItems, count: totalCount, total_records: String(totalCount), // 转成字符串匹配原数据格式 offset: objA.offset, // 若两个对象offset不同,可改为取最大值/最小值或其他规则 has_more: objA.has_more && objB.has_more // 若只要有一个has_more为true就保留true,可改为|| }; } // 使用示例 const mergedObj = mergeResultObjects(obj1, obj2); console.log(mergedObj);
支持合并多个对象的扩展函数
如果需要合并两个以上的同结构对象,可以使用以下函数:
function mergeMultipleResultObjects(...objects) { // 扁平化所有对象的items数组 const mergedItems = objects.flatMap(obj => obj.items); const totalCount = mergedItems.length; // 以第一个对象的属性为基准,按需调整 const baseObj = objects[0]; return { items: mergedItems, count: totalCount, total_records: String(totalCount), offset: baseObj.offset, has_more: objects.some(obj => obj.has_more) // 只要有一个对象has_more为true,结果就为true }; } // 使用示例 const mergedObj = mergeMultipleResultObjects(obj1, obj2);
关键说明
- items数组拼接:使用扩展运算符
[...arr1, ...arr2]或flatMap,既简洁又不会修改原数组。 - 统计属性更新:直接用合并后
items的长度作为新的count,并转换为字符串匹配total_records的原格式。 - 其他属性处理:
offset和has_more的取值逻辑可根据业务需求调整,比如offset取最大值,has_more只要存在true就保留true等。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

