繁体   English   中英

如何向数组中具有相似 ID 的对象添加计数属性

[英]How can I add a count property to objects with similar id in array

我有这个由多个对象组成的数组,并且根据数量,我设法根据数量将具有相似 id 的对象相乘,从而为拣货应用程序制作产品轮播:

我不知道该怎么做,也许运行一个 for 循环。 我正在使用 reduce 来展平阵列。

const flattenedOrderProducts = await orderProductsArr.reduce((acc, item) => {
                    return [
                        ...acc,
                        ...Array.from({ length: item.quantity }, () => ({...item})),
                    ]
                }, [])

[
  {
    "orderid": "28318",
    "id": 4040,
    "name": "Soap",
    "quantity": 2
  },
  {
    "orderid": "28318",
    "id": 4040,
    "name": "Soap",
    "quantity": 2
  },
  {
    "orderid": "28318",
    "id": 7313,
    "name": "Olive Oil",
    "quantity": 1
  },
  {
    "orderid": "28318",
    "id": 5670,
    "name": "Tomato 1kg",
    "quantity": 2
  },
  {
    "orderid": "28318",
    "id": 5670,
    "name": "Tomato 1kg",
    "quantity": 2
  }

我想要的是一个计数器——让拣货员查看还有多少要拣货。

[
  {
    "orderid": "28318",
    "id": 4040,
    "name": "Soap",
    "quantity": 2,
    "itemsLeft": 2
  },
  {
    "orderid": "28318",
    "id": 4040,
    "name": "Soap",
    "quantity": 2,
    "itemsLeft": 1
  },
  {
    "orderid": "28318",
    "id": 7313,
    "name": "Olive Oil",
    "quantity": 1,
    "itemsLeft": 1
  },
  {
    "orderid": "28318",
    "id": 5670,
    "name": "Tomato 1kg",
    "quantity": 3,
    "itemsLeft": 3
  },
  {
    "orderid": "28318",
    "id": 5670,
    "name": "Tomato 1kg",
    "quantity": 3,
    "itemsLeft": 2
  },
  {
    "orderid": "28318",
    "id": 5670,
    "name": "Tomato 1kg",
    "quantity": 3,
    "itemsLeft": 1
  }

正如@Heretic Monkey 建议的那样,您确实可以使用 array.from 方法中的第二个参数。 因此,只需对您的示例进行非常小的调整,您就会得到以下代码,(我相信)正是您想要的。

const flattenedOrderProducts = await orderProductsArr.reduce((acc, item) => {
                    return [
                        ...acc,
                        ...Array.from({ length: item.quantity }, (_, i) => ({...item, itemsLeft: i + 1})),
                    ]
                }, [])

我可以建议一些改变。 首先你真的需要等待吗? reduce 是一个同步 function。 其次,通过使用扩展运算符填充数组,您实际上将数组的全部内容复制到一个新数组并返回它。 我建议将您的 function 实现为类似

const flattenedOrderProducts = orderProductsArr.reduce((acc, item) => {
  for (let itemsLeft = 1; itemsLeft <= item.quantity; itemsLeft ++) {
    acc.push({ ...item, itemsLeft });
  }
  return acc;
}, [])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM