我有一个数组,其中包含不同数量的数据, 我想用我想要的数据替换数组的周期内容
例如:
该期间的键0到4的数据数组必须包含“ 2010-10-10”。 键5到10期间的数据数组必须包含“ 2010-11-11”
条件:我需要一个0-4、5-9、10-14(5的倍数)中的数据数组 我有以下数据:
[
{
"id": "1",
"name": "SUNARTA",
"period":"",
},
{
"id": "2",
"name": "AAN",
"period":"",
},
{
"id": "3",
"name": "MIKO",
"period":"",
},
{
"id": "4",
"name": "NIKA",
"period":"",
},
{
"id": "5",
"name": "LALA",
"period":"",
},
{
"id": "6",
"name": "MMAAN",
"period":"",
},
{
"id": "7",
"name": "NINA",
"period":"",
}
]
这是我的代码
for (var i = 0; i < element.length; i++) {
var datePeriod = new Date(req.body.start);
var periode = datePeriod;
if (i % 5 == 0) {
datePeriod.setDate(datePeriod.getDate() + 1);
element[i].periode = periode;
} else {
element[i].periode = periode;
}
}
我希望数据应该
[
{
"id": "1",
"name": "SUNARTA",
"period":"2010-10-10",
},
{
"id": "2",
"name": "AAN",
"period":"2010-10-10",
},
{
"id": "3",
"name": "MIKO",
"period":"2010-10-10",
},
{
"id": "4",
"name": "NIKA",
"period":"2010-10-10",
},
{
"id": "5",
"name": "LALA",
"period":"2010-10-10",
},
{
"id": "6",
"name": "MMAAN",
"period":"2011-11-11",
},
{
"id": "7",
"name": "NINA",
"period":"2011-11-11",
},
]
答案 0 :(得分:1)
您可以使用array#map
并在每5次迭代后根据索引递增日期对每个对象进行迭代,并更新period
属性。
const data = [ { "id": "1", "name": "SUNARTA", "period":"", }, { "id": "2", "name": "AAN", "period":"", }, { "id": "3", "name": "MIKO", "period":"", }, { "id": "4", "name": "NIKA", "period":"", }, { "id": "5", "name": "LALA", "period":"", }, { "id": "6", "name": "MMAAN","period":"", }, { "id": "7", "name": "NINA", "period":"", }],
size = 5,
startDate = '2010-10-10',
result = data.map((o,i) => {
let index = Math.floor(i/size);
let period = i == 0 ? new Date(startDate) :
(date => (new Date(date.setDate(date.getDate() + index))))(new Date(startDate));
period = period.toISOString().substring(0,10);
return {...o, period};
},[]);
console.log(result);
答案 1 :(得分:1)
如果您想每5个项目增加一天的日期,则可以执行以下操作:
一个函数,该函数需要一个开始日期和一个数字(数组的索引),并根据该数字将天数添加到开始日期:
function calcDate(startDate, i) {
return formatDate(
new Date(
new Date(startDate).setDate(
//add a day every 5 days
startDate.getDate() + Math.floor(i / 5),
),
),
);
}
现在创建一个保存开始日期的变量:var date = new Date();
使用Array.prototype.map映射数组,您必须创建一个新数组,在该数组中设置了句点,并使用计算日期函数的结果传递开始日期和当前项目的索引:
var result = data.map(function(d, i) {
return Object.assign({}, d, {
period: calcDate(date, i),
});
});
完整代码:
var data = [{"id":"1","name":"SUNARTA","period":""},{"id":"2","name":"AAN","period":""},{"id":"3","name":"MIKO","period":""},{"id":"4","name":"NIKA","period":""},{"id":"5","name":"LALA","period":""},{"id":"6","name":"MMAAN","period":""},{"id":"7","name":"NINA","period":""}];
function pad(num) {
return ('000' + num).slice(-2);
}
function formatDate(date) {
return [
date.getFullYear(),
pad(date.getMonth() + 1),
pad(date.getDate()),
].join('-');
}
function calcDate(startDate, i) {
return formatDate(
new Date(
new Date(startDate).setDate(
//add a day every 5 days
startDate.getDate() + Math.floor(i / 5),
),
),
);
}
var date = new Date();
var result = data.map(function(d, i) {
return Object.assign({}, d, {
period: calcDate(date, i),
});
});
console.log(result);
答案 2 :(得分:1)
您非常接近解决方案。您的问题是您要在每个循环上重新初始化 datePeriod 。您只需要执行一次,然后在第5个元素上递增一次。因此,将初始化移到 for 循环之外(并整理一些其他内容):
var element = [{"id": "1","name": "SUNARTA","period": ""},
{"id": "2","name": "AAN","period": ""},
{"id": "3","name": "MIKO","period": ""},
{"id": "4","name": "NIKA","period": ""},
{"id": "5","name": "LALA","period": ""},
{"id": "6","name": "MMAAN","period": ""},
{"id": "7","name": "NINA","period": ""}];
// Helper to format the date
function formatDate(d) {
return `${d.getFullYear()}-${('0'+d.getMonth()).slice(-2)}-${('0'+d.getDate()).slice(-2)}`;
}
// Initialise datePeriod outside the loop
var datePeriod = new Date();
for (var i = 0; i < element.length; i++) {
// This variable is unnecessary
//var periode = datePeriod;
// Increment datePeriod every 5th element
// The else loop isn't necessary
if (i && i % 5 == 0) {
datePeriod.setDate(datePeriod.getDate() + 1);
}
element[i].period = formatDate(datePeriod);
}
console.log(element)
这只会创建一个Date对象,因此它会相当有效。