Ramda lib-JavaScript-数据重构/分组

问题描述 投票:0回答:2

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

我要使用的库是ramdahttps://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)
javascript ramda.js
2个回答
0
投票

下划线具有按功能here分组。

它返回一个对象图,该对象图由您作为组提供的属性作为键,并且值是与所提供的键匹配的对象

const groups = groupBy(data, item => item.times[0].starting_time)

console.log('groups', groups)

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

console.log('newData', newData)

0
投票

这里是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简化的好时机。

© www.soinside.com 2019 - 2024. All rights reserved.