【问题标题】:Typescript map collection打字稿地图集合
【发布时间】:2021-11-07 05:11:24
【问题描述】:

我有这个复杂的模型,我正在尝试映射。

  • 我有一个 购物车 数组,其中包含 ID、名称等
  • 我有一个字典,其中键是一种类型,它的值是不同的产品。

我在页面底部添加了一个结果应该是什么样子的示例。

我的尝试,但卡在如何过滤

carts.forEach(cart => {
    const productList = cart.products; //list of products

    Object.entries(content.data).forEach(([key, values]) => {
      const sizeList = values.map(x => x.sizeList); //list of size
      // i am stuck here
    });
  });

【问题讨论】:

  • Stack Overflow 上有很多这样的问题...

标签: javascript typescript ecmascript-6


【解决方案1】:

const getCartsWithProductNames = (carts = [], content = {}) => {
  // create a Map with productId-sizeId as key, and size name as value
  const productSizeNameMap = 
    Object.values(content)
    .flat()
    .reduce((map, { productId, sizeList = [] }) => {
      sizeList.forEach(({ sizeId, name }) =>
        map.set(`${productId}-${sizeId}`, name)
      );
      return map;
    }, new Map);
  // return carts list with product items having names from productSizeNameMap
  return carts.map(({ cartId, cartName, products = [] }) => ({
    id: cartId,
    name: cartName,
    productItems: products.map(({ id, size, quantity, isVisible }) => ({
      id, quantity, isVisible, name: productSizeNameMap.get(`${id}-${size}`)
    }))
  }));
}

const 
  carts = [
    {
      cartId: 500,
      cartName: "Some name",
      products: [ { id: 1, size: 10, quantity: 1, isVisible: true }, { id: 2, size: 13, quantity: 10, isVisible: true } ]
    }
  ],
  content = {
    "Drinks": [
      { productId: 1, sizeList: [ { sizeId: 10, name: "100ml beer" }, { sizeId: 9, name: "200ml beer" } ]
      }
    ],
    "Food": [
      {
        productId: 2,
        sizeList: [ { sizeId: 12, name: "6 wings" }, { sizeId: 13, name: "12 wings" } ]
      }
    ]
};

console.log( getCartsWithProductNames(carts, content) );

【讨论】:

  • 哇,这很快,谢谢。我正在使用打字稿并在 .reduce((map, { productId, sizeList = [] }) 线上它无法识别此重载
  • 不客气,你遇到的错误是什么,你有什么类型的?
  • 现在我只是将您的代码复制到我的编辑器中,它指出 TS2769:在 reduce 方法上没有重载匹配此调用
  • 您是否在需要的地方填写了类型?尝试向我发送一个我可以调试的沙盒
  • 如果您将代码粘贴到 VS Code,您会看到错误。选择 Typescript 作为语言
猜你喜欢
  • 2013-08-29
  • 2017-05-09
  • 2016-12-08
  • 1970-01-01
  • 2019-11-12
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多