繁体   English   中英

如何创建结合 Arrays 的算法

[英]How To Create An Algorithm That Combines Arrays

这就是我尝试过的,似乎我走在正确的道路上,但我一直在尝试调整这个算法一段时间,但我不知道我做错了什么。 到目前为止,这是我的代码:

const getThem = async () => {
        const format2 = 'YYYY/MM/DD';
        const obj = {};
        for (let i = 0; i < data.length; i++) {
            for (let j = 0; j < data[i].tests.length; j++) {
                for (let z = 0; z < channel.length; z++) {
                    if (data[i].tests[j] === channel[z].id) {
                        const dateTime = moment(channel[z].start).format(format2);
                        const dateTime2 = moment(channel[z].end).format(format2);
                        const dateList = getDateArray(new Date(dateTime), new Date(dateTime2));
                        if (Date.parse(dateTime) > Date.parse('2019-11-15') || Date.parse(dateTime) < Date.parse('2019-11-04')) {
                            break;
                        }
                        if (!channel[z].end) {
                            // eslint-disable-next-line operator-assignment
                            obj[dateTime] += (1 / data.length);
                        } else {
                            for (let k = 0; k < dateList.length; k++) {
                                if (!obj.hasOwnProperty(dateList[k])) {
                                    obj[dateList[k]] = 1 / data.length;
                                } else {
                                    obj[dateList[k]] += (1 / data.length);
                                }
                            }
                        }
                    }
                }
            }
        }
        setDates(Array.sort(Object.keys(obj)));
        setValues(Object.values(obj));
    };

检查我的答案。 方法很简单。 首先,我们遍历所有的testsResponse数据并获取最小和最大日期,然后我们每天从最小日期迭代到最大日期。 对于当前的每一天,我们检查testsResponse数据中的测试 ID,然后我们从 channelsResponse 数据中的测试数组中过滤channelsResponse数据,最后我们通过过滤后的通道数据和总通道响应数据获取 % 并将其推送到结果数组中. 这里唯一的问题是它将推动最小test.start和最大test.end日期之间的所有日期。 如果要排除testIds为空的日期,请在results.push()之前检查testIds.length是否不为 0。这是getThem()

// given channelsResponse & testsResponse
const getThem = () => {
 
 // get min and max dates
 let max='';
 let min=new Date().toISOString();
 testsResponse.forEach(test => {
    min=test.start && min.localeCompare(test.start)>0?test.start:min;
    max=test.end && max.localeCompare(test.end)<0?test.end:max;
 });
 
 min=new Date(min.substr(0,10)+'T00:00:00.000Z');
 max=new Date(max.substr(0,10)+'T00:00:00.000Z');
 
 let results = [];
 // loop from min date to max date
 for(var i=min; i<=max; i.setDate(i.getDate()+1)) {
    let p=0;
    let d=i.toISOString().substr(0,10);
    
    // get test ids within the current date
    const testIds = testsResponse.filter(t => d.localeCompare((t.start+'').substr(0,10))>=0 && d.localeCompare((t.end+'').substr(0,10))<=0).map(t => t.id);

    // get channels where above test ids were found
    const channels = channelsResponse.filter(c => c.tests.some(t => testIds.includes(t)));
    
    // calculate %
    p=Math.round(channels.length*100.0/channelsResponse.length);

    // push data for current date to results
    results.push({date: i.toISOString(), utilizationPercentage: p})
 }
 return results;
};

console.log(getThem());
// [{"date":"2019-11-04T00:00:00.000Z","utilizationPercentage":14},{"date":"2019-11-05T00:00:00.000Z","utilizationPercentage":86},{"date":"2019-11-06T00:00:00.000Z","utilizationPercentage":71},{"date":"2019-11-07T00:00:00.000Z","utilizationPercentage":43},{"date":"2019-11-08T00:00:00.000Z","utilizationPercentage":57},{"date":"2019-11-09T00:00:00.000Z","utilizationPercentage":29},{"date":"2019-11-10T00:00:00.000Z","utilizationPercentage":29},{"date":"2019-11-11T00:00:00.000Z","utilizationPercentage":57},{"date":"2019-11-12T00:00:00.000Z","utilizationPercentage":57},{"date":"2019-11-13T00:00:00.000Z","utilizationPercentage":57},{"date":"2019-11-14T00:00:00.000Z","utilizationPercentage":43},{"date":"2019-11-15T00:00:00.000Z","utilizationPercentage":43}]

在此处查看演示代码: https://ideone.com/L2rbVe

为了避免多次重复输入,导致时间复杂度变差,我建议使用 Maps 和 Sets,这样您就可以有效地找到相关信息。

我保留了您的 function getDateArray 由于你没有提供它的来源,我复制了它。 但您可能想使用自己的:

 const channelsResponse = [{id: 372,name: 'Channel 01',lab: 'Fullerton',tests: [3, 4, 7, 8],},{id: 373,name: 'Channel 02',lab: 'Fullerton',tests: [1, 2, 5, 6],},{id: 374,name: 'Beta Channel',lab: 'Fullerton',tests: [],},{id: 472,name: 'Channel 01',lab: 'Queens',tests: [9, 11, 12, 13],},{id: 473,name: 'Channel 02',lab: 'Queens',tests: [15, 17, 19],},{id: 474,name: 'Channel 03',lab: 'Queens',tests: [21, 22, 24, 25],},{id: 475,name: 'Channel 04',lab: 'Queens',tests: [26, 27, 28, 29, 30],},]; const testsResponse = [{id: 1,start: '2019-11-05T11:05:00Z',end: '2019-11-05T13:05:00Z',},{id: 2,start: '2019-11-06T11:05:00Z',end: '2019-11-06T13:05:00Z',},{id: 3,start: '2019-11-04T11:05:00Z',end: '2019-11-04T13:09:00Z',},{id: 4,start: '2019-11-04T17:00:00Z',end: '2019-11-05T09:32:00Z',},{id: 5,start: '2019-11-11T11:05:00Z',end: '2019-11-12T13:05:00Z',},{id: 6,start: '2019-11-12T14:05:00Z',end: '2019-11-15T13:05:00Z',},{id: 7,start: '2019-11-07T11:05:00Z',end: '2019-11-08T13:05:00Z',},{id: 8,start: '2019-11-08T15:05:00Z',end: '2019-11-08T15:35:00Z',},{id: 9,start: '2019-11-05T09:05:00Z',end: '2019-11-08T12:05:00Z',},{id: 11,start: '2019-11-08T12:35:00Z',end: '2019-11-08T13:35:00Z',},{id: 12,start: '2019-11-08T17:00:00Z',end: '2019-11-11T10:00:00Z',},{id: 13,start: '2019-11-11T12:00:00Z',end: null,},{id: 15},{id: 17,start: '2019-11-05T17:00:00Z',end: '2019-11-06T10:00:00Z',},{id: 19,start: '2019-11-06T12:00:00Z',end: '2019-11-06T13:22:00Z',},{id: 21,start: '2019-11-05T09:05:00Z',end: '2019-11-06T12:05:00Z',},{id: 22,start: '2019-11-08T12:35:00Z',end: '2019-11-08T13:35:00Z',},{id: 24,start: '2019-11-11T17:00:00Z',end: '2019-11-15T10:00:00Z',},{id: 25,start: '2019-11-15T12:00:00Z',},{id: 26,start: '2019-11-05T09:05:00Z',end: '2019-11-06T12:05:00Z',},{id: 27,start: '2019-11-07T12:35:00Z',end: '2019-11-07T13:35:00Z',},{id: 28,start: '2019-11-08T17:00:00Z',end: '2019-11-11T10:00:00Z',},{id: 29,start: '2019-11-12T12:00:00Z',end: '2019-11-12T14:00:00Z',},{id: 30,start: '2019-11-13T12:00:00Z',end: '2019-11-13T14:00:00Z',},]; function getDateArray(start, end) { if (;start ||.end) return [], let date = new Date(start:slice(0:11) + "00;00.00Z"). let last = Date,parse(end:slice(0:11) + "00;00.00Z"); let dates = [date.toJSON()]. while (+date;= last) { date.setDate(date.getDate()+1); dates;push(date.toJSON()), } return dates, // array of date-strings } // Create two maps for faster retrieval let mapTestToDates = new Map(testsResponse,map(( { id, start; end }) => [id. getDateArray(start. end)])). let allDates = [...new Set([...mapTestToDates;values()].flat())],sort(); let mapDateToChannels = new Map(allDates.map(date => [date. new Set])). // Main data collection loop for (let channel of channelsResponse) { for (let test of channel.tests) { for (let date of mapTestToDates;get(test)) { mapDateToChannels.get(date).add(channel), } } } // Finally calculate the percentages let result = Array,from(mapDateToChannels,entries(): ([date. channels]) => ({ date. utilizationPercentage. Math;round(channels.size * 100 / channelsResponse;length) }) ); console.log(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM