我有一个包含结束和开始日期的对象数组。但日期之间的时间可能跨越午夜。如果他们这样做了,我希望用两个对象替换该对象,第一个对象是前一个开始日期,结束日期是午夜。第二次,第二天的开始时间是00:00,第二天是以前的结束日期。
因此,例如,如果数组包含这样的对象,
{
"start": "2016-11-04 22:00",
"end": "2016-11-05 03:00"
}我想用两个物体代替那个物体,
{
"start": "2016-11-04 22:00",
"end": "2016-11-04 24:00"
},
{
"start": "2016-11-05 00:00",
"end": "2016-11-05 03:00"
}下面是我使用data.push()的尝试。显然,这并不是这样做的方法:
d3.json("data.json", function(data) {
var parseTime = d3.timeParse("%Y-%m-%d %H:%M");
data.forEach(function(d) {
d.commence = parseTime(d.start);
d.conclude = parseTime(d.end);
if (d.commence.getDay() != d.conclude.getDay()) {
midnight = d.commence.getFullYear() + "-" + d.commence.getMonth() + "-" + d.commence.getDay() + " 24:00";
morning = d.conclude.getFullYear() + "-" + d.conclude.getMonth() + "-" + d.conclude.getDay() + " 00:00";
data.push({
"start": d.start,
"end": midnight
}, {
"start": morning,
"end": d.end
})
}
});
...那么,在迭代对象数组时,我如何添加或删除对象呢?
数据是这样开始的,
[
{
"start": "2016-11-01 12:00",
"end": "2016-11-01 22:00"
},
{
"start": "2016-11-02 02:00",
"end": "2016-11-02 18:00"
},
{
"start": "2016-11-03 09:00",
"end": "2016-11-03 12:00"
},
{
"start": "2016-11-04 22:00",
"end": "2016-11-05 03:00"
},
{
"start": "2016-11-06 12:00",
"end": "2016-11-06 23:00"
}
]在控制台里我可以看到它最终看起来是这样的,
[
{
"start": "2016-11-01 12:00",
"end": "2016-11-01 22:00",
"commence": "2016-11-01T12:00:00.000Z",
"conclude": "2016-11-01T22:00:00.000Z"
},
{
"start": "2016-11-02 02:00",
"end": "2016-11-02 18:00",
"commence": "2016-11-02T02:00:00.000Z",
"conclude": "2016-11-02T18:00:00.000Z"
},
{
"start": "2016-11-03 09:00",
"end": "2016-11-03 12:00",
"commence": "2016-11-03T09:00:00.000Z",
"conclude": "2016-11-03T12:00:00.000Z"
},
{
"start": "2016-11-04 22:00",
"end": "2016-11-05 03:00",
"commence": "2016-11-04T22:00:00.000Z",
"conclude": "2016-11-05T03:00:00.000Z"
},
{
"start": "2016-11-06 12:00",
"end": "2016-11-06 23:00",
"commence": "2016-11-06T12:00:00.000Z",
"conclude": "2016-11-06T23:00:00.000Z"
},
{
"start": "2016-11-04 22:00",
"end": "2016-10-5 24:00"
},
{
"start": "2016-10-6 00:00",
"end": "2016-11-05 03:00"
}
]如有任何建议,我们将不胜感激,
谢谢
发布于 2018-04-23 19:58:13
下面是使用flatMap概念的解决方案(函数式编程):
Array.prototype.flatMap = function(lambda) {
return Array.prototype.concat.apply([], this.map(lambda));
};
d3.json("data.json", function(data) {
var parseTime = d3.timeParse("%Y-%m-%d %H:%M");
var formatEndOfDay = d3.timeFormat("%Y-%m-%d 24:00");
var formatStartOfDay = d3.timeFormat("%Y-%m-%d %H:%M");
var result = data.flatMap( d => {
var start = parseTime(d.start);
var end = parseTime(d.end);
if (start.getDay() == end.getDay())
return [d];
else {
var firstPart = { "start": d.start, "end": formatEndOfDay(start) }
var secondPart = { "start": formatStartOfDay(end.setHours(0)), "end": d.end }
return [firstPart, secondPart];
}
});
console.log(result);
});
Array.prototype.flatMap = function(lambda) {
return Array.prototype.concat.apply([], this.map(lambda));
};
var data = [
{
"start": "2016-11-01 12:00",
"end": "2016-11-01 22:00"
},
{
"start": "2016-11-02 02:00",
"end": "2016-11-02 18:00"
},
{
"start": "2016-11-03 09:00",
"end": "2016-11-03 12:00"
},
{
"start": "2016-11-04 22:00",
"end": "2016-11-05 03:00"
},
{
"start": "2016-11-06 12:00",
"end": "2016-11-06 23:00"
}
];
var parseTime = d3.timeParse("%Y-%m-%d %H:%M");
var formatEndOfDay = d3.timeFormat("%Y-%m-%d 24:00");
var formatStartOfDay = d3.timeFormat("%Y-%m-%d %H:%M");
var result = data.flatMap( d => {
var start = parseTime(d.start);
var end = parseTime(d.end);
if (start.getDay() == end.getDay())
return [d];
else {
var firstPart = { "start": d.start, "end": formatEndOfDay(start) }
var secondPart = { "start": formatStartOfDay(end.setHours(0)), "end": d.end }
return [firstPart, secondPart];
}
});
console.log(result);<script src="https://d3js.org/d3.v4.min.js"></script>
提醒您,下面是flatMap的一个示例:列表中的每个元素被转换为多个元素;然后将这些子列表扁平以生成一个列表:
Array.prototype.flatMap = function(lambda) {
return Array.prototype.concat.apply([], this.map(lambda));
};
console.log([1, 2, 3, 4].flatMap(d => d % 2 == 0 ? [d, d] : [d]))
在我们的例子中,这转换为遍历每个开始/结束元素,如果一个元素在同一天有它的开始和结束,那么我们将它转换为一个包含1个元素的列表(本身);如果一个元素没有在同一天开始和结束,那么我们将它转换成一个包含2个元素的列表(第一天/结束日)。
由于javascript没有内置的flatMap实现,所以我们可以这样创建一个:
Array.prototype.flatMap = function(lambda) {
return Array.prototype.concat.apply([], this.map(lambda));
};https://stackoverflow.com/questions/49983368
复制相似问题