JavaScript分组数组与年龄组,并找到最大的日期

问题描述 投票:0回答:2

我正在尝试为每个年龄段实现类似的东西,我想找到最大的日期,然后与今天的日期进行比较,得到日期差异并存储到另一个单独的数组中。以下是一些示例输入:

//removed

我按升序对数组进行了排序:

frequentarr.sort(function(a, b) {
    da = new Date(a.date);
    db = new Date(b.date);
    if (da == db) {
        return 0;
    }
    return da > db ? 1 : -1;
});
console.log(frequentarr);

我的年龄组数组:

var ageGroup = ['>=80', '70-79', '60-69', '50-59', '40-49', '30-39', '20-29', '10-19', '0-9'];

我不确定如何根据年龄组对帐户进行实际分组,然后针对每个年龄组,找到最大的日期。之后,与今天的日期进行比较,找出日期差异。

有任何想法吗?谢谢!

javascript arrays grouping
2个回答
0
投票

您可以将年龄除以10除以该组,并检查日期是否大于存储日期。如果没有,请采取实际日期。

var array = [{ age: 67, date: "2017/01/09" }, { age: 11, date: "2017/01/14" }, { age: 11, date: "2017/01/14" }, { age: 62, date: "2017/01/15" }, { age: 40, date: "2017/01/21" }, { age: 21, date: "2017/02/08" }, { age: 12, date: "2017/02/18" }, { age: 56, date: "2017/02/29" }, { age: 24, date: "2017/03/03" }, { age: 22, date: "2017/03/17" }, { age: 66, date: "2017/03/25" }, { age: 62, date: "2017/04/03" }, { age: 59, date: "2017/05/18" }, { age: 39, date: "2017/06/14" }, { age: 19, date: "2017/07/03" }, { age: 31, date: "2017/07/10" }, { age: 24, date: "2017/07/14" }, { age: 36, date: "2017/07/24" }, { age: 36, date: "2017/07/24" }, { age: 73, date: "2017/08/17" }, { age: 63, date: "2017/10/01" }, { age: 16, date: "2017/10/14" }, { age: 70, date: "2017/10/18" }, { age: 29, date: "2017/12/03" }, { age: 15, date: "2017/12/07" }, { age: 47, date: "2017/12/19" }, { age: 11, date: "2017/12/25" }, { age: 26, date: "2017/12/28" }],
    groups = [];

array.forEach(function (o) {
    var group = Math.floor(o.age / 10);

    if (groups[group] >= o.date) {
        return;
    }
    groups[group] = o.date;
});

console.log(groups);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1
投票

我首先按日期对frequentarray进行排序,然后使用reduce对其进行分组。我正在使用地图,因此您只需使用年龄组即可获得最新日期

m.get(<ageGroup>)[0];

let frequentarr = [{accountID: "-Ks8mWcr2x08gEbSCSuJ", age: 67, gender: "female", brand: "Akira", date: "2017/01/09"},
    {accountID: "-Ks8mWh4j7fv7XaQyygJ", age: 11, gender: "female", brand: "Akira", date: "2017/01/14"},
    {accountID: "-Ks8mWh4j7fv7XaQyygJ", age: 11, gender: "female", brand: "Akira", date: "2017/01/14"},
    {accountID: "-Ks8mWayOns5WnK0xu3e", age: 62, gender: "male", brand: "Akira", date: "2017/01/15"},
    {accountID: "-Ks8mWYnb4fu1AT9vR8X", age: 40, gender: "male", brand: "Akira", date: "2017/01/21"},
    {accountID: "-Ks8mWf0deAAVlOSb2qS", age: 21, gender: "male", brand: "Akira", date: "2017/02/08"},
    {accountID: "-Ks8mWbH4YQhXg9DZvjG", age: 12, gender: "male", brand: "Akira", date: "2017/02/18"},
    {accountID: "-Ks8mWZpiUOt8aXyEY22", age: 56, gender: "female", brand: "Akira", date: "2017/02/29"},
    {accountID: "-Ks8mW_HvNJ3RKCz6QZk", age: 24, gender: "male", brand: "Akira", date: "2017/03/03"},
    {accountID: "-Ks8mWgBmSBh6LrsLMU4", age: 22, gender: "male", brand: "Akira", date: "2017/03/17"},
    {accountID: "-Ks8mWgceHTuJsBObl_C", age: 66, gender: "female", brand: "Akira", date: "2017/03/25"},
    {accountID: "-Ks8mWYhd7WuUGJMUTzx", age: 62, gender: "female", brand: "Akira", date: "2017/04/03"},
    {accountID: "-Ks8mWhQ-TsvAbvS0Sk2", age: 59, gender: "male", brand: "Akira", date: "2017/05/18"},
    {accountID: "-Ks8mWY4PQ3stDWTlriB", age: 39, gender: "male", brand: "Akira", date: "2017/06/14"},
    {accountID: "-Ks8mWYMZw8YTs6P-UCk", age: 19, gender: "male", brand: "Akira", date: "2017/07/03"},
    {accountID: "-Ks8mWcm1zYkSQN2fD9c", age: 31, gender: "male", brand: "Akira", date: "2017/07/10"},
    {accountID: "-Ks8mWalbiAq35e10lZy", age: 24, gender: "male", brand: "Akira", date: "2017/07/14"},
    {accountID: "-Ks8mWjmbuBtmzzJ2IPu", age: 36, gender: "female", brand: "Akira", date: "2017/07/24"},
    {accountID: "-Ks8mWjmbuBtmzzJ2IPu", age: 36, gender: "female", brand: "Akira", date: "2017/07/24"},
    {accountID: "-Ks8mWbNJ53rNuspHlQe", age: 73, gender: "male", brand: "Akira", date: "2017/08/17"},
    {accountID: "-Ks8mWcvM1-w0GAl-eHs", age: 63, gender: "male", brand: "Akira", date: "2017/10/01"},
    {accountID: "-Ks8mWhvTEp83PziAxpp", age: 16, gender: "male", brand: "Akira", date: "2017/10/14"},
    {accountID: "-Ks8mWdGfSrC-5n8ywNs", age: 70, gender: "female", brand: "Akira", date: "2017/10/18"},
    {accountID: "-Ks8mWdf0LfFKWH8-YBF", age: 29, gender: "male", brand: "Akira", date: "2017/12/03"},
    {accountID: "-Ks8mWhtA-3ExwVUWZC_", age: 15, gender: "female", brand: "Akira", date: "2017/12/07"},
    {accountID: "-Ks8mWX4R6inD83AO4rZ", age: 47, gender: "female", brand: "Akira", date: "2017/12/19"},
    {accountID: "-Ks8mWh4j7fv7XaQyygJ", age: 11, gender: "female", brand: "Akira", date: "2017/12/25"},
    {accountID: "-Ks8mWadHFzJ1VGmN60k", age: 26, gender: "male", brand: "Akira", date: "2017/12/28"}];

let ageGroups = ['80-1000', '70-79', '60-69', '50-59', '40-49', '30-39', '20-29', '10-19', '0-9'];

function getAgeRange(age) {
    return ageGroups.find(e => {
        let s = e.split('-');
        return age >= s[0] && age <= s[1];
    })
}

let m = frequentarr.sort((a,b) => new Date(b.date) - new Date(a.date)).reduce((a,b) => {
    let r = getAgeRange(b.age);
    return a.set(r, a.has(r) ? a.get(r).concat(b) : [b])
}, new Map);

console.log(m);
© www.soinside.com 2019 - 2024. All rights reserved.