gpt4 book ai didi

javascript - 无法获得想要的结果数组

转载 作者:行者123 更新时间:2023-11-29 15:28:58 25 4
gpt4 key购买 nike

我目前正在学习 lodash 和 moment.js,我正在使用一些虚拟数据。包含 1000 名医生列表的虚拟数据。我已经开始使用 Array.prototype.map()Array.prototype.filter() 并将很快将它们转换为 lodash。

数据

var doctors = [
{
"id": 0,
"dateOfEmployment": "2012-12-27",
"dateOfTermination": "2015-01-13",
"dateOfBirth": "1978-06-06",
"gender": "Male"
},
{
"id": 1,
"dateOfEmployment": "2016-02-08",
"dateOfTermination": null,
"dateOfBirth": "1984-04-21",
"gender": "Female"
},
{
"id": 2,
"dateOfEmployment": "2010-11-30",
"dateOfTermination": "2015-09-03",
"dateOfBirth": "1975-09-24",
"gender": "Male"
},
{
"id": 3,
"dateOfEmployment": "2012-06-17",
"dateOfTermination": null,
"dateOfBirth": "1980-08-31",
"gender": "Female"
},..];

我想得到最近 2 年的数组结果:

[{ date: '2015-04', count: 22 }, 
{ date: '2015-05', count: 25 },
...]

最初我试过这个:

    doctors = doctors.filter(function(doctor){
return moment(doctor.dateOfEmployment).isBetween('2014-04', '2016-04');
}).map(function(doctor){
return {
dates: moment(doctor.dateOfEmployment).format('YYYY-MM'),
count: new Date(doctor.dateOfEmployment) - new Date(doctor.dateOfEmployment) + 1 };
}););


console.log(doctors);

我很困惑。我是否应该先创建一个只有 iddateOfEmploymentdateOfTermination 的新医生数组,然后将这两个日期时刻化。然后使用 moment isBetween the years 然后 map/reduce 的条件过滤新的日期数组。

我确实想到了蛮力方法,我会在每个医生身上循环 24 次,并根据条件增加一个计数器,如果 doctorsEmployment 日期和 doctorsTermination 日期为空或等于临时日期。临时日期从“2014-04”到“2016-04”,最后将其插入数组结果对象。

我是不是以错误的方式解决了这个问题?

任何帮助将不胜感激!

最佳答案

不是 lodash 或 moment.js,而是使用普通 JS 的方法:

// Sample data
var doctors = [
{
"id": 0,
"dateOfEmployment": "2012-12-27",
"dateOfTermination": "2015-01-13",
"dateOfBirth": "1978-06-06",
"gender": "Male"
},
{
"id": 1,
"dateOfEmployment": "2016-02-08",
"dateOfTermination": null,
"dateOfBirth": "1984-04-21",
"gender": "Female"
},
{
"id": 2,
"dateOfEmployment": "2016-02-29",
"dateOfTermination": "2015-09-03",
"dateOfBirth": "1975-09-24",
"gender": "Male"
},
{
"id": 3,
"dateOfEmployment": "2015-06-17",
"dateOfTermination": null,
"dateOfBirth": "1980-08-31",
"gender": "Female"
}];

// Parse ISO date string (e.g. 2016-04-01) as local
function parseISODate(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1]? b[1] - 1 : 0, b[2] || 1);
}

var startDate = parseISODate('2014-04'),
endDate = parseISODate('2016-04');

// Creates an object with months and counts
var resultObj = doctors.reduce(function(acc, cur) {
var d = parseISODate(cur.dateOfEmployment);
if (d >= startDate && d <= endDate) {
var month = d.toISOString().slice(0,7);
acc[month] = (acc[month] || 0) + 1;
}
return acc;
}, {});

// Creates an array with required objects from result object
var resultArr = Object.keys(resultObj).map(function(key) {
return {date: key, count: resultObj[key]};
})

document.write(
JSON.stringify(resultObj) + '<br>' + // {"2016-02":2,"2015-06":1}
JSON.stringify(resultArr) // [{"date":"2016-02","count":2},{"date":"2015-06","count":1}]
);

假设您只需要计数大于零的月份。它遍历一次原始数据,然后遍历一次结果对象,尽管我看不出数组是一种比创建它的对象更理想的格式。

请注意,我将源数据编辑为在 2016 年 2 月有两个 dateOfEmployment 日期。

关于javascript - 无法获得想要的结果数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36685038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com