我有下面data个对象,其中包含有关productscustomerspurchases的信息.

const data = {
  products: [
    {
      id: "p01",
      name: "Bike Insurance",
    },
    {
      id: "p02",
      name: "Car Insurance",
    },
    {
      id: "p03",
      name: "Home Insurance",
    },
    {
      id: "p04",
      name: "Pet Insurance",
    },
  ],
  customers: [
    { id: "c01", firstname: "Rachel", lastname: "Jane" },
    { id: "c02", firstname: "Leilah", lastname: "Mandi" },
    { id: "c03", firstname: "Campbell", lastname: "Kendall" },
    { id: "c04", firstname: "Madonna", lastname: "Sammie" },
  ],
  purchases: [
    {
      customerId: "c01",
      purchases: [
        {
          productId: "p02",
          purchasedAt: "2021-08-03T00:00:00.000Z",
        },
        {
          productId: "p02",
          purchasedAt: "2021-08-04T00:00:00.000Z",
        },
        {
          productId: "p01",
          purchasedAt: "2021-09-12T00:00:00.000Z",
        },
        {
          productId: "p01",
          purchasedAt: "2021-09-12T00:00:00.000Z",
        },
      ],
    },
    {
      customerId: "c03",
      purchases: [
        {
          productId: "p04",
          purchasedAt: "2021-08-03T00:00:00.000Z",
        },
        {
          productId: "p04",
          purchasedAt: "2021-09-12T00:00:00.000Z",
        },
        {
          productId: "p03",
          purchasedAt: "2021-09-12T00:00:00.000Z",
        },
        {
          productId: "p01",
          purchasedAt: "2021-09-12T00:00:00.000Z",
        },
      ],
    },
    {
      customerId: "c02",
      purchases: [
        {
          productId: "p01",
          purchasedAt: "2021-09-12T00:00:00.000Z",
        },
      ],
    },
  ],
};

到目前为止,我已经使用以下代码过滤了进行了购买的客户:

const customersWhoPurchased = data["customers"].filter((c) =>
  data["purchases"].find((p) => p.customerId === c.id)
)

所以这customersWhoPurchased个现在看起来是这样的:

[ { id: 'c01', firstname: 'Rachel', lastname: 'Jane' },
  { id: 'c02', firstname: 'Leilah', lastname: 'Mandi' },
  { id: 'c03', firstname: 'Campbell', lastname: 'Kendall' } ]

我现在想要实现的是判断data对象中每个客户的购买,判断purchases.purchases数组中的productId并将其与products匹配,然后返回客户购买的每个产品的name,并将它们添加到customersWhoPurchased数组中的附加键值对中,值是每个产品名称的array.所以最终的结果应该是这样的.

customers: [
  { id: "c01", firstname: "Rachel", lastname: "Jane", productNames: ['Bike Insurance', 'Car Insurance'] },
  { id: "c02", firstname: "Leilah", lastname: "Mandi", productNames: ['Bike Insurance'] },
  { id: "c03", firstname: "Campbell", lastname: "Kendall", productNames: ['Bike Insurance', 'Home Insurance', 'Pet Insurance'] },
],

希望这对我在这里努力实现的目标是有意义的.

最棒的不仅是解决方案,而且是关于你如何解决问题的解释/理论.我真的在努力提高关于复杂对象的问题解决能力,所以这里的任何帮助都会有很大帮助.

推荐答案

您可以通过迭代进行购买的客户,然后使用mapfind来获得与他们的购买相关联的产品名称来实现这一点. 代码首先映射到CustomersWho Purchated数组,并在data.Purchase中 for each 客户找到他们相应的购买记录.然后,它映射客户的购买,并为每次购买在data.Products中找到相应的产品.最后,它返回一个新对象,该对象具有与原始Customer对象相同的属性,但具有一个包含产品名称数组的额外的ProductNames属性. 下面是实现这一点的代码:

const customersWithProductNames = customersWhoPurchased.map((customer) => {
  // Get the corresponding purchase record for the customer
  const customerPurchases = data.purchases.find(
    (purchase) => purchase.customerId === customer.id
  );

  // Map the productIds in the purchases to their corresponding product names
  const productNames = customerPurchases.purchases.map((purchase) => {
    const product = data.products.find(
      (product) => product.id === purchase.productId
    );
    return product.name;
  });

  // Add the productNames array to the customer object and return it
  return {
    ...customer,
    productNames: productNames,
  };
});

console.log(customersWithProductNames);
Expected Output:
[
  {
    id: 'c01',
    firstname: 'Rachel',
    lastname: 'Jane',
    productNames: ['Car Insurance', 'Car Insurance', 'Bike Insurance', 'Bike Insurance']
  },
  {
    id: 'c02',
    firstname: 'Leilah',
    lastname: 'Mandi',
    productNames: ['Bike Insurance']
  },
  {
    id: 'c03',
    firstname: 'Campbell',
    lastname: 'Kendall',
    productNames: ['Pet Insurance', 'Pet Insurance', 'Home Insurance', 'Bike Insurance']
  }
]

Javascript相关问答推荐

jest使用useLocate测试自定义挂钩

在JavaScript中使用setProperty方法试图修改css元素值时,我遇到错误

为什么新的Promises会在不需要的情况下被用来等待?

错误:找不到react-redux上下文值;请确保该组件包装在React原生Expo应用程序中的提供者中

在JavaScript中打开和关闭弹出窗口

基于每个索引迭代嵌套对象

在时间轴完整日历中显示日期标题

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

我在这个黑暗模式按钮上做错了什么?

我应该在redux reducer中调用其他reducer函数吗?

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

Angular中计算信号和getter的区别

在JS中拖放:检测文件

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

如何在使用rhandsontable生成表时扩展数字输入验证?

为什么JPG图像不能在VITE中导入以进行react ?

React Refs不与高阶组件(HOC)中的动态生成组件一起工作

使用API调用的VUE 3键盘输入同步问题

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

如果对象中的字段等于某个值,则从数组列表中删除对象