【问题标题】:Dynamically create ranges based off values in array根据数组中的值动态创建范围
【发布时间】:2021-08-09 22:36:24
【问题描述】:

我有从服务器返回的数据,我需要分类到存储桶中进行显示。

数据是这样的

Array [
  Object {
    "name": "1.00",
    "value": 17,
  },
  Object {
    "name": "1.01",
    "value": 10,
  },
  Object {
    "name": "1.5",
    "value": 9,
  },
  Object {
    "name": "1.20",
    "value": 8,
  },
  Object {
    "name": "1.30",
    "value": 7,
  },
  Object {
    "name": "0.80",
    "value": 5,
  }
 ]

对于本例,名称是“大小”,值是系统中出现的次数。 IE:(5条大小为“0.80”的记录,8条大小为“1.20”的记录)

最终目标是将数据按如下方式排序:

[
{key: 'Under .30', value: 11}, 
{key: '.30 to .39', value: 3}, 
{key: '.40 .49', value: 2}, 
...
...
{key: '.90 to .99', value: 1}, 
{key: '1.00 to 1.09', value: 3}, 
{key: '1.10 to 1.19', value: 2}, 
...
...
{key: '5.00 to 5.09', value: 5},
{key: '5.00 to 5.09', value: 1},
...
{key: 'Over 10', value: 3},
{key: 'Other', value 21}
]

其中键是大小,值是该分组的总出现次数。

基本上我想做以下事情:

  1. 对于每一行,将名称解析为浮点数
  2. 根据其名称确定是否已为此值创建了一个范围。
  3. 如果不是,则创建范围,按行值递增值
  4. 如果范围已创建,则将值增加行值

我真的只能考虑提前静态创建所有超过 100 个的数组(0.30 到 10+),然后再次使用 if 语句循环,超过 100 个。

如果有人能帮助解决这个问题,或者让我更好地了解如何解决这个问题,我们将不胜感激!

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    首先我会启动一个创建这些条件数组的函数。

    从你给出的例子中我可以看出

    它的起始小数点为 0.30 并添加 0.10 直到 10 和 超过 10.0。

    function createConditions(startValue, endValue, increment) {
      let conditions = [
        {
          key: `Under ${startValue}`,
          value: 0,
          condition: (val) => val < startValue,
        },
      ];
    
      for (let i = startValue; i < endValue - increment; i += increment) {
        conditions.push({
          key: `${i} to ${i + increment}`,
          value: 0,
          condition: (val) => val > i && val < i + increment,
        });
      }
    
      conditions.push({
        key: `Over ${endValue}`,
        value: 0,
        condition: (val) => val > endValue,
      });
    
      return conditions;
    }
    
    let conditionsArray = createConditions(0.3, 3.0, 0.1);
    

    在此之后,您可以使用此函数创建条件数组

    const testData = [
      { name: "1.00", value: 17 },
      { name: "1.01", value: 10 },
      { name: "1.5", value: 9 },
      { name: "1.20", value: 8 },
      { name: "1.30", value: 7 },
      { name: "0.80", value: 5 },
    ];
    

    从这里你有一个数组,其中包含你的键值和条件以及 来自服务器的另一个数组。

    遍历服务器数据并检查条件。 (这部分可能在一个函数中,您可以将条件数组和数据发送到一个函数,并根据您想使用的方式获取这部分的结果:)

    testData.forEach((datum) => {
      let find = conditionsArray.find((checker) =>
        checker.condition(parseFloat(datum.name))
      );
    
      if (find) {
        find.value += datum.value;
      }
    });
    

    在此之后,您应该记录条件数组并查看结果。

    console.log(conditionsArray.filter((ch) => ch.value > 0));
    // to show only conditions that have more then 0 :)
    

    最后控制台给了我这个

    [
      {
        key: '0.7999999999999999 to 0.8999999999999999',
        value: 5,
        condition: [Function: condition]
      },
      {
        key: '0.9999999999999999 to 1.0999999999999999',
        value: 27,
        condition: [Function: condition]
      },
      {
        key: '1.4000000000000001 to 1.5000000000000002',
        value: 9,
        condition: [Function: condition]
      }
    ]
    

    有关编程中的浮点数,请参阅https://0.30000000000000004.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2014-08-23
      相关资源
      最近更新 更多