我有一些原始国家/地区和开始时间数据-像这样的数据中列出了
我要使用的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 +替代品与
applySpec
和values
结合在一起,对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/