
本文介绍如何遍历对象数组,对 productname 相同的项,将其 productid 替换为该名称首次出现时对应的 productid,从而实现“同名产品共用同一 id”的数据标准化处理。
本文介绍如何遍历对象数组,对 productname 相同的项,将其 productid 替换为该名称首次出现时对应的 productid,从而实现“同名产品共用同一 id”的数据标准化处理。
在实际业务中(如商品导入、数据清洗或前端展示优化),我们常遇到一类场景:原始数据中 productName 存在重复,但每个对象自带唯一 productId;而逻辑上要求“相同名称的产品应视为同一实体”,因此需将后续重复项的 productId 统一为首次出现时的 ID。
解决思路是:一次遍历 + 哈希映射(Map)记录首现 ID。我们使用一个普通对象(或 Map)作为查找表,键为 productName,值为首次遇到该名称时对应的 productId。后续再遇到相同名称时,直接复用该 ID 并更新当前对象。
以下是完整、健壮的实现代码:
const products = [
{ productId: 1, productName: 'Apple', price: 1.0 },
{ productId: 2, productName: 'Banana', price: 0.5 },
{ productId: 3, productName: 'Orange', price: 1.2 },
{ productId: 4, productName: 'Apple', price: 1.0 },
{ productId: 5, productName: 'Banana', price: 0.5 },
];
// 创建 productName → 首次 productId 的映射表
const nameToFirstId = {};
products.forEach((product, index) => {
const { productName, productId } = product;
if (nameToFirstId.hasOwnProperty(productName)) {
// 已存在:覆盖当前 productId 为首次 ID
products[index].productId = nameToFirstId[productName];
} else {
// 首次出现:记录该 productId
nameToFirstId[productName] = productId;
}
});
console.log(products);
// 输出:
// [
// { productId: 1, productName: 'Apple', price: 1.0 },
// { productId: 2, productName: 'Banana', price: 0.5 },
// { productId: 3, productName: 'Orange', price: 1.2 },
// { productId: 1, productName: 'Apple', price: 1.0 },
// { productId: 2, productName: 'Banana', price: 0.5 }
// ]✅ 关键优势:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 时间复杂度 O(n),仅需单次遍历;
- 空间复杂度 O(k),k 为不重复 productNames 数量;
- 原地修改,无需额外数组,节省内存。
⚠️ 注意事项:
- 此方案修改原数组。若需保持不可变性(如 React 状态更新或函数式编程场景),请先深拷贝数组再操作;
- 若
productName可能为undefined或null,建议增加空值校验(例如if (productName == null) return;); - 使用
Object.hasOwn()(ES2022+)替代hasOwnProperty()可避免原型链污染风险,兼容性要求高时仍可保留后者。
? 进阶提示:若需返回新数组而非修改原数组,可结合 map() 与闭包 Map 实现:
const updatedProducts = products.map((product, index, arr) => {
if (!nameToFirstId.hasOwnProperty(product.productName)) {
nameToFirstId[product.productName] = product.productId;
}
return { ...product, productId: nameToFirstId[product.productName] };
});该方法语义清晰、副作用可控,推荐用于强调数据不可变性的现代前端架构中。

















