我有一些原始国家/地区和开始时间数据-像这样的数据中列出了

我要使用的lib是ramda
https://jsfiddle.net/0kdcvahw/

  var data = [
    {
      "label": "Argentina",
      "isIncluded": true,
      "times": [
        {"text": "", "starting_time": Date.parse('2020-01-14T10:00:00Z'), "ending_time": Date.parse('2020-02-14T15:20:00Z')}
      ]
    },
    {
      "label": "Chile",
      "isIncluded": true,
      "times": [
        {"text": "", "starting_time": Date.parse('2020-01-14T10:00:00'), "ending_time": Date.parse('2020-05-20T03:24:00')}
      ]
    },
    {
      "label": "United States of America",
      "isIncluded": true,
      "times": [
        {"text": "", "starting_time": Date.parse('2020-01-14T11:00:00Z'), "ending_time": Date.parse('2020-03-20T03:24:00')}
      ]
    }
  ];


我想重新配置列表,使其更像这样

var data = [
    {
        label: 'Argentina, Chilie',
        value: 90,
    },
    {
        label: 'United States',
        value: 10,
    }
];


因此,基本上-有3个国家-其中2个国家/地区在同一天和同一开始时间开始,例如10:00 -1在同一天开始,但11:00



代码示例-但需要删除最后一个逗号

var data = [
    {
      "label": "Argentina",
      "isIncluded": true,
      "times": [
        {"text": "", "starting_time": Date.parse('2020-01-14T10:00:00Z'), "ending_time": Date.parse('2020-02-14T15:20:00Z')}
      ]
    },
    {
      "label": "Chile",
      "isIncluded": false,
      "times": [
        {"text": "", "starting_time": Date.parse('2020-01-14T10:00:00'), "ending_time": Date.parse('2020-05-20T03:24:00')}
      ]
    },
    {
      "label": "United States of America",
      "isIncluded": true,
      "times": [
        {"text": "", "starting_time": Date.parse('2020-01-14T11:00:00Z'), "ending_time": Date.parse('2020-03-20T03:24:00')}
      ]
    }
  ];


//console.log("data",data);
const groups = R.groupBy(x => x.times[0].starting_time, data);



const newData = Object.keys(groups).map(key => {
  return {
    label: groups[key].reduce((c, n) => `${c}${n.label}, `, ''),
    value: groups[key].length
  }
})

console.log('newData', newData)

最佳答案

这是Ramda方法:



const transform = pipe (
  groupBy (path (['times', 0, 'starting_time'])),
  values,
  map (applySpec ({
    label: pipe (pluck ('label'), join (', ')),
    value: length
  }))
)

const data = [{"isIncluded": true, "label": "Argentina", "times": [{"ending_time": 1581693600000, "starting_time": 1578996000000, "text": ""}]}, {"isIncluded": false, "label": "Chile", "times": [{"ending_time": 1589945040000, "starting_time": 1578996000000, "text": ""}]}, {"isIncluded": true, "label": "United States of America", "times": [{"ending_time": 1584674640000, "starting_time": 1578999600000, "text": ""}]}]

console .log (transform (data))

<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>const {pipe, groupBy, path, values, map, applySpec, pluck, join, length} = R</script>





我假设某些日期缺少最后一个"Z"的事实仅仅是错字。如果某些应该具有它,而另一些则没有,那么您将获得一些非常奇怪的数据,并且它与您提供的输出不匹配,除非您碰巧生活在该时区。

之后,对于Ramda来说,这是相当简单的代码。 groupBy具有为您提供该项目的规范密钥的功能。在这里,我们将其传递为path的结果。 path接受字符串或整数数组,并返回一个函数,该函数将在输入对象的该路径处返回值;如果不存在任何节点,则为undefined。 groupBy (fn)返回一个对象,该对象在找到的每个规范键处都具有一个数组,并且输入数组中的项目被划分为这些数组。

我们对结果调用values,仅是对Object.values的引用;它返回一个数组数组。

在每个外部数组上(通过map),我们调用applySpec,它将键映射到函数,并使用这些键创建一个对象,其值是将相应函数应用于输入值的结果。对于value,我们只返回基础数组的length,对于label,我们从每个对象中提取label条目,然后将它们与", "联接。

在这里的答案中,我经常展示现代JS如何使某些Ramda函数的吸引力降低。虽然我可以在这里通过将一些简单的ES6 +替代品与applySpecvalues结合在一起,对length使用简单的lambda并将pipe (pluck ('label'), join (', ')替换为arr => arr .map (item => item .label) .join (', ')来实现。但是我不打扰,因为我们仍然必须写一次等同于groupBy的代码。虽然这并不困难,但我认为代码会比这更长。而且我看不到它有任何好处。如果我还没有在项目中使用Ramda,我当然会这样做,但是总的来说,这是使用Ramda简化的好时机。

关于javascript - Ramda lib-JavaScript-数据重构/分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59899569/

10-13 08:59