0

0

如何合并具有相同 ID 的对象数组中的行

心靈之曲

心靈之曲

发布时间:2026-02-03 13:39:00

|

160人浏览过

|

来源于php中文网

原创

如何合并具有相同 ID 的对象数组中的行

本文介绍如何将包含重复 vendorid 的对象数组按 id 合并,自动聚合各月字段(如 jan、feb、mar),缺失字段补 0,最终生成结构统一、无重复 id 的规范化数组。

在实际数据处理中,我们常遇到原始数据以“稀疏记录”形式存在:同一供应商(VendorID)的销售或费用信息分散在多条记录中,每条仅填充部分月份字段。目标是将其归并为一条完整记录,实现字段优先级覆盖(后出现的非空值覆盖前值)并补齐缺失字段为默认值(如 0)。以下是一种简洁、可读性强且不依赖外部库的原生 JavaScript 实现方案。

核心思路

  1. 遍历原始数组,对每个对象按 VendorID 进行分组归并;
  2. 使用 Array.prototype.find() 定位已存在的同 ID 记录
  3. 利用对象展开语法 {...existing, ...new} 实现字段合并——注意:后出现的属性会覆盖先出现的(即“后写入优先”),这恰好满足“用新值补充旧记录”的需求;
  4. 最后统一标准化字段结构,确保所有输出对象都包含 Jan、Feb、Mar 等键,并将 undefined 或空字符串转换为数值 0(可根据业务需要改为 "" 或 "N/A")。

完整实现代码

const testarray = [
  { "VendorID": "001", "Jan": "130", "Feb": "500" },
  { "VendorID": "001", "Jan": "0", "Feb": "0", "Mar": "1000" },
  { "VendorID": "002", "Mar": "20" }
];

const result = [];

testarray.forEach(entry => {
  const existing = result.find(item => item.VendorID === entry.VendorID);

  if (existing) {
    // 移除原记录,合并后重新加入(保证顺序与首次出现一致)
    const index = result.indexOf(existing);
    result.splice(index, 1, { ...existing, ...entry });
  } else {
    result.push({ ...entry });
  }
});

// 标准化字段:强制包含 Jan/Feb/Mar,空值转为 0(数值型更利于后续计算)
const finalarray = result.map(item => ({
  VendorID: item.VendorID,
  Jan: Number(item.Jan) || 0,
  Feb: Number(item.Feb) || 0,
  Mar: Number(item.Mar) || 0
}));

console.log(finalarray);
// 输出:
// [
//   { VendorID: "001", Jan: 0, Feb: 0, Mar: 1000 },  ← 注意:此处 "Jan": "0" 覆盖了 "130"
//   { VendorID: "002", Jan: 0, Feb: 0, Mar: 20 }
// ]

⚠️ 重要说明与注意事项

EnablePPA中小学绩效考核系统2.0
EnablePPA中小学绩效考核系统2.0

无论从何种情形出发,在目前校长负责制的制度安排下,中小学校长作为学校的领导者、管理者和教育者,其管理水平对于学校发展的重要性都是不言而喻的。从这个角度看,建立科学的校长绩效评价体系以及拥有相对应的评估手段和工具,有利于教育行政机关针对校长的管理实践全过程及其结果进行测定与衡量,做出价值判断和评估,从而有利于强化学校教学管理,提升教学质量,并衍生带来校长转变管理观念,提升自身综合管理素质。

下载
  • 上述实现遵循“后写入优先”原则。例如 VendorID: "001" 的第二条记录中 "Jan": "0" 会覆盖第一条的 "130"。若需“保留首次非空值”,应改用条件赋值逻辑(如 Jan: item.Jan != null ? item.Jan : existing?.Jan)。
  • Number(...) 转换可防止字符串 "0" 被误判为 falsy;若需保留字符串格式,可改用 item.Jan ?? "0"。
  • 若月份字段动态不确定(如新增 Apr、May),建议先扫描全量 key 集合,再做统一初始化,避免硬编码
  • 性能提示:对于超大数据集(>10,000 条),find() + splice() 的 O(n²) 复杂度可能成为瓶颈,此时推荐改用 Map 做 O(1) ID 索引:
const map = new Map();
testarray.forEach(entry => {
  const id = entry.VendorID;
  const existing = map.get(id) || {};
  map.set(id, { ...existing, ...entry });
});
const finalarray = Array.from(map.values()).map(item => ({ 
  VendorID: item.VendorID,
  Jan: Number(item.Jan) || 0,
  Feb: Number(item.Feb) || 0,
  Mar: Number(item.Mar) || 0
}));

该方案兼顾可读性、健壮性与扩展性,适用于报表汇总、前端数据预处理等典型场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

238

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

519

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

626

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

718

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

670

2024.04.29

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

0

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号