有人可以帮我这个算法吗?

问题描述 投票:-6回答:1

我想获取以下对象并创建以下结果的数组。最佳的时间复杂性以及使用lodash或任何其他库来使其成为更易读的代码。

var calendar = {
Q1 : {
    P1 : {
        WK1 : {
            start: '1/1/2018',
            end: '1/7/2018'
        },
        WK2 : {
            start: '1/8/2018',
            end: '1/14/2018'
        }
    },
    P2 : {
        WK3 : {
            start: '1/15/2018',
            end: '1/21/2018'
        }
    }
},
Q2 : {
    P3 : {
        WK5 : {
            start: '2/1/2018',
            end: '2/7/2018'
        },
        WK6 : {
            start: '2/8/2018',
            end: '2/14/2018'
        }
    },
    P4 : {
        WK7 : {
            start: '2/15/2018',
            end: '2/21/2018'
        }
    }
}
}

结果是一个对象数组,其中数组中的每个对象将具有其周期的第一周的开始日期和其周期内的最后一周的结束日期,如下所示:

[
    {
        quarter: 'Q1',
        period: 'P1',
        start_date: '1/1/2018',
        end_date: '1/14/2018'
    },
    {
        quarter: 'Q1',
        period: 'P2',
        start_date: '1/15/2018',
        end_date: '1/21/2018'
    },
        {
        quarter: 'Q2',
        period: 'P3',
        start_date: '2/1/2018',
        end_date: '2/14/2018'
    },
        {
        quarter: 'Q2',
        period: 'P4',
        start_date: '2/15/2018',
        end_date: '2/21/2018'
    }
]
javascript arrays algorithm object
1个回答
1
投票

你可以使用reduce来做这种事情,这是一个例子:

var calendar = {Q1 : {P1 : {WK1 : {start: '1/1/2018',end: '1/7/2018'},WK2 : {start: '1/8/2018',end: '1/14/2018'}},P2 : {WK3 : {start: '1/15/2018',end: '1/21/2018'}}},Q2 : {P3 : {WK5 : {start: '2/1/2018',end: '2/7/2018'},WK6 : {start: '2/8/2018',end: '2/14/2018'}},P4 : {WK7 : {start: '2/15/2018',end: '2/21/2018'}}}};

var result = Object.keys(calendar).reduce((a, c) => {
  Object.keys(calendar[c]).forEach(period => {
     let weeks = Object.values(calendar[c][period]);
     let firstWeek = weeks[0];
     let lastWeek = weeks[weeks.length - 1];
     a.push({quarter: c, period: period, start_date: firstWeek.start, end_date: lastWeek.end});
  });
  return a;
}, []);

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