按不同数组中设置的属性类型分隔项目

Posted

技术标签:

【中文标题】按不同数组中设置的属性类型分隔项目【英文标题】:Seperate items by an attribute type set in different arrays 【发布时间】:2018-08-02 05:15:04 【问题描述】:

我正在尝试通过在 restful API 中返回的名为“ProductGroupName”的属性来分隔项目。我想循环并为每个部分创建一个单独的数组,其中每个部分都列为该属性。

我可以在服务器端操纵我的 SQL 来改变给出结果的方式,但这会导致问题;这是一个示例结果:

 
"message": "Success",
  "data": [
    
      "StockID": 69323,
      "TradeName": "NAN OPTIPRO HA 1 GLD 800G",
      "ProductGroupName": "BABY FOODS",
      "SOH": 24,
      "MinimumSOH": 0,
      "Retail": 3199,
      "AverageRetail": 0,
      "Cost": 2848,
      "RealCost": 2791,
      "Reorder": true,
      "Message": null,
      "ListCost": null,
      "Markup": 12,
      "PLU": "476358",
      "NoDiscount": true
    ,
    
      "StockID": 18057,
      "TradeName": "NAN PRO 2 GLD 800G",
      "ProductGroupName": "BABY FOODS",
      "SOH": 19,
      "MinimumSOH": 0,
      "Retail": 2050,
      "AverageRetail": 0,
      "Cost": 2301,
      "RealCost": 1918,
      "Reorder": false,
      "Message": null,
      "ListCost": null,
      "Markup": -10,
      "PLU": "436178",
      "NoDiscount": true
    ,
    
      "StockID": 74206,
      "TradeName": "OPTIFAST VLCD SHAKE BANANA 12X53G (NEW)",
      "ProductGroupName": "WEIGHT LOSS",
      "SOH": 6,
      "MinimumSOH": 0,
      "Retail": 4799,
      "AverageRetail": 0,
      "Cost": 3937,
      "RealCost": 3086,
      "Reorder": true,
      "Message": null,
      "ListCost": null,
      "Markup": 10,
      "PLU": "294454",
      "NoDiscount": true
    ],

这是所有结果的标准输出,因此更改结果会使我编写 REST 服务的方式复杂化。

对这些项目进行分组的最佳方式是什么? 我正在考虑遍历它们,当找到一个新的“ProductGroup”时,会创建一个新的数组并插入该项目,但这似乎不是很优化,我想知道是否有更好的方法来实现这一点.

【问题讨论】:

that doesn't seem very optimised 为什么不呢?你会在 SO 上看到与数组/对象相关的答案一直在推荐这种东西 我不确定,我想这是有道理的,但我不想养成任何坏习惯,所以我认为值得请教更有经验的人 这是一个三行 reduce 函数。只要数组不是 10000 项长,就不用担心 我会说,我什至没有考虑reduce函数哈哈只是一些混乱的循环所以我很高兴我问了:P 【参考方案1】:

以您在问题中描述的方式组织请求结果的最简单方法之一是将 Array.prototype.reduce 应用于结果的“数据”:

result.data.reduce((acc, item) => 
  const name = item['ProductGroupName'];
  acc[name] = acc[name] || [];
  acc[name].push(item);
  return acc;
, );

通过这种方法,您将获得以下对象

BABY FOODS: Array(2), WEIGHT LOSS: Array(1)

【讨论】:

我得到 'TypeError: Cannot read property 'reduce' of undefined' @Cacoon 我的result.data 是你的“数据”。 哦,我以为我必须引用 Array.*data* 而不是仅仅传递数据;对不起,我是个白痴,我已经修剪了数据。完美运行,非常感谢!

以上是关于按不同数组中设置的属性类型分隔项目的主要内容,如果未能解决你的问题,请参考以下文章

对sql语句的查询结果按条件显示不同的颜色

如何让自定义标签栏显示标签栏项目在 Xcode 中设置的选定图像?

iOS 8:在界面构建器中设置的自定义标签栏项目的选定图像不起作用

如何为代码中设置的参数设置布局单位?

如何正确命名包含返回从此类中设置的源中选择的值并以相同方式设置源值的属性的类?

为不同类型的项目数组正确的 JSON Schema