You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何匹配两个对象数组并重构订单数组?

订单数组与包裹价格匹配的实现方案

核心思路

先将包裹价格数组转换为以packageId为键的映射结构(如Map/哈希表),实现单价的快速查找,避免嵌套循环带来的性能损耗;之后遍历原订单数组,将每个订单项与映射中的单价合并,生成包含单价的新订单数组。

JavaScript 实现示例

// 原始订单数组
const order = [{ packageId: 'pkg001', quantity: 2 }, { packageId: 'pkg002', quantity: 5 }];
// 从数据库获取的包裹价格数组
const packagePrice = [{ packageId: 'pkg001', unitPrice: 19.99 }, { packageId: 'pkg002', unitPrice: 29.99 }];

// 1. 构建价格映射表
const priceMap = new Map(packagePrice.map(item => [item.packageId, item.unitPrice]));

// 2. 生成包含单价的新订单数组
const updatedOrder = order.map(item => ({
  ...item,
  UnitPrice: priceMap.get(item.packageId) // 匹配对应单价,键名与需求示例一致
}));

console.log(updatedOrder);
// 输出:[{ packageId: 'pkg001', quantity: 2, UnitPrice: 19.99 }, { packageId: 'pkg002', quantity: 5, UnitPrice: 29.99 }]

异常场景处理(可选)

若packagePrice中存在未覆盖的packageId,可根据业务需求添加处理逻辑:

const updatedOrder = order.map(item => {
  const unitPrice = priceMap.get(item.packageId);
  if (unitPrice === undefined) {
    // 此处可选择抛出错误、设默认值或标记异常
    throw new Error(`未找到包裹 ${item.packageId} 的价格信息`);
  }
  return {
    ...item,
    UnitPrice: unitPrice
  };
});

Java 实现示例

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 包裹价格实体类
class PackagePrice {
    private String packageId;
    private double unitPrice;

    public PackagePrice(String packageId, double unitPrice) {
        this.packageId = packageId;
        this.unitPrice = unitPrice;
    }

    public String getPackageId() { return packageId; }
    public double getUnitPrice() { return unitPrice; }
}

// 订单项实体类
class OrderItem {
    private String packageId;
    private int quantity;
    private double UnitPrice;

    public OrderItem(String packageId, int quantity) {
        this.packageId = packageId;
        this.quantity = quantity;
    }

    public String getPackageId() { return packageId; }
    public int getQuantity() { return quantity; }
    public void setUnitPrice(double unitPrice) { UnitPrice = unitPrice; }

    @Override
    public String toString() {
        return "OrderItem{" +
                "packageId='" + packageId + '\'' +
                ", quantity=" + quantity +
                ", UnitPrice=" + UnitPrice +
                '}';
    }
}

public class OrderProcessor {
    public static void main(String[] args) {
        // 原始订单列表
        List<OrderItem> order = new ArrayList<>();
        order.add(new OrderItem("pkg001", 2));
        order.add(new OrderItem("pkg002", 5));

        // 数据库获取的包裹价格列表
        List<PackagePrice> packagePrice = new ArrayList<>();
        packagePrice.add(new PackagePrice("pkg001", 19.99));
        packagePrice.add(new PackagePrice("pkg002", 29.99));

        // 1. 构建价格映射
        Map<String, Double> priceMap = new HashMap<>();
        for (PackagePrice price : packagePrice) {
            priceMap.put(price.getPackageId(), price.getUnitPrice());
        }

        // 2. 生成新订单列表
        List<OrderItem> updatedOrder = new ArrayList<>();
        for (OrderItem item : order) {
            OrderItem updatedItem = new OrderItem(item.getPackageId(), item.getQuantity());
            updatedItem.setUnitPrice(priceMap.get(item.getPackageId()));
            updatedOrder.add(updatedItem);
        }

        // 输出结果
        updatedOrder.forEach(System.out::println);
    }
}

性能说明

该实现的时间复杂度为O(n + m),其中n为订单数组长度,m为包裹价格数组长度,相比嵌套循环的O(n*m),在数据量较大时性能优势显著。

内容的提问来源于stack exchange,提问作者Firas SCMP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:05:48