从数组Javascript获取数据

时间:2018-11-22 09:19:41

标签: javascript node.js

我有一个数组,其中包含不同数量的数据, 我想用我想要的数据替换数组的周期内容

例如:

该期间的键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",
 },
 ]

3 个答案:

答案 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对象,因此它会相当有效。