【问题标题】:Javascript produce this simple array of numbers from simple dataJavascript 从简单数据中生成这个简单的数字数组
【发布时间】:2020-02-13 22:36:17
【问题描述】:

如果有人能想到更好的标题,我愿意接受。无论如何,我一直在努力让它产生正确的输出几个小时,但并没有让它在所有情况下都能正常工作。

简单地说,我有一个固定日期列表,包括一个范围内的每一天,我需要在提供的日期数组中生成一个日期之间的间隔数组。 p>

所以在下面的例子中:

fixed dates: [2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28, 2019-09-29]
given dates: [2019-09-23, 2019-09-24, 2019-09-26, 2019-09-27, 2019-09-28]

第一个数字是 0,因为开放日期和提供的日期之间没有间隔。然后从那里只是每个日期之间的差距: [0, 1, 2, 1, 1, 2]

为了更清楚地说明我们如何获得这些数字:

 [2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28, 2019-09-29]
 [2019-09-23, 2019-09-24,             2019-09-26, 2019-09-27, 2019-09-28]
0       1         2                         1          1           2    

一段时间后我让它工作正常,但还有另一个因素,每个日期都有相关的数据,如果连续有两个或多个相同的数据,我们也会跳过一天。请注意,数据和给定日期具有相同的长度,因此具有相同的索引。因此,在下面的示例中连续两个值,我们也跳过它,因此所需的输出如下:

fixed dates: [2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28, 2019-09-29]
given dates: [2019-09-23, 2019-09-24, 2019-09-26, 2019-09-27, 2019-09-28]
given data: [82.0, 85.5, 85.5, 85.0, 86.5]
desired output: [0, 1, 3, 1*, 1, 2]
  • 已跳过 必须跳过,否则列表中的元素过多。

我不会发布我尝试过的内容,因为我认为它不是那么好,而且会影响答案。但我尝试了任何方法,从查找日期之间的差异,到在 for 循环中使用简单的增量,每次跳过日期时都会增加。

如果初始固定日期和第一个给定日期之间存在差异,则数组中的第一个数字不会为零,而是差异。

这是一些数据和所需的输出:

fixed dates: [2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28, 2019-09-29, 2019-09-30, 2019-10-01, 2019-10-02, 2019-10-03, 2019-10-04]
given dates: [2019-09-23, 2019-09-24, 2019-09-26, 2019-09-27, 2019-09-28, 2019-10-01]
given data: [82.0, 85.0, 84.0, 85.0, 86.5, 84.0]
desired output: [0, 1, 2, 1, 1, 3, 3]

fixed dates: [2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14, 2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18]
given dates: [2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-15, 2019-09-17]
given data: [85.0, 81.0, 85.0, 85.0, 83.0, 85.5]
desired output: [1, 1, 1, 3, 2*, 2, 2]
* skipped
Must skip otherwise there will be too many elements.

fixed dates: [2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14, 2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21, 2019-09-22]
given dates: [2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-15, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21]
given data: [85.0, 81.0, 85.0, 85.0, 83.0, 85.5, 85.0, 86.0, 85.0, 84.5]
desired output: [1, 1, 1, 3, 2*, 2, 1, 1, 1, 1, 2]
* skipped
Must skip otherwise there will be too many elements.

fixed dates: [2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14, 2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21, 2019-09-22]
given dates: [2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21]
given data: [85.0, 81.0, 85.0, 85.0, 83.0, 83.5, 85.5, 85.0, 85.0, 85.0, 84.5]
desired output: [1, 1, 1, 3, 2*, 1, 1, 1, 3, 2*, 1*, 2]
* skipped
Must skip otherwise there will be too many elements.

我想这可能有点太难了,但我想我还是会发布它,看看是否有人能想出一个好的解决方案。

【问题讨论】:

  • 您能开发出如何获得您的阵列[0, 1, 2, 1, 1, 2] 吗?也就是(至少跟在 0 后面的 1 和 2)
  • @user753642 不确定您的意思...问题是如何从提供的数据中获取该数组。这就是为什么它旁边会显示desired output
  • 你在解释这个数组应该包含所提供日期之间的间隔......但是你知道它的逻辑生成(如果是,为什么它应该是给定输入数据的所需输出中的 1)或您是否要求我们对将输入映射到所需输出的函数进行逆向工程? (他们给你什么的)
  • @user753642 1 代表一天,如果像第一个示例 2019-09-24, 2019-09-26 那样有 2 天的差距,我们得到 2。开头的零是开头的特殊情况是第一个固定日期和第一个给定日期之间的差距,在第一个例子中没有差距,所以它是 0。
  • @user753642 在我的问题开头附近添加了另一个示例,以更清楚地显示日期间隔。

标签: javascript arrays


【解决方案1】:

为了在值保持不变时扩大差距,并考虑到没有数据的日期,我建议以相反的顺序迭代固定数据。

我在这里提供了一个 JavaScript 实现。

function getGaps(fixedDates, dates, values) {
    let j = dates.length-1;
    let result = Array(dates.length+1).fill(0);
    let gap = 0;
    for (let i = fixedDates.length - 1; i >= 0; i--) { // Go backwards
        gap++; // Count every entry in fixedDates 
        if (j >= 0 && fixedDates[i] === dates[j]) {
            result[j + 1] = gap;
            // Only reset gap when value is different from previous
            if (j === 0 || values[j] !== values[j - 1]) gap = 0; 
            j--;
        }
    }
    result[0] = gap;
    return result;
}

let tests = [[
    ["2019-09-23", "2019-09-24", "2019-09-25", "2019-09-26", "2019-09-27", "2019-09-28", "2019-09-29"],
    ["2019-09-23", "2019-09-24", "2019-09-26", "2019-09-27", "2019-09-28"],
    [82.0, 85.5, 85.5, 85.0, 86.5]
], [
    ["2019-09-23", "2019-09-24", "2019-09-25", "2019-09-26", "2019-09-27", "2019-09-28", "2019-09-29", "2019-09-30", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04"],
    ["2019-09-23", "2019-09-24", "2019-09-26", "2019-09-27", "2019-09-28", "2019-10-01"],
    [82.0, 85.0, 84.0, 85.0, 86.5, 84.0]
], [
    ["2019-09-09", "2019-09-10", "2019-09-11", "2019-09-12", "2019-09-13", "2019-09-14", "2019-09-15", "2019-09-16", "2019-09-17", "2019-09-18"],
    ["2019-09-10", "2019-09-11", "2019-09-12", "2019-09-13", "2019-09-15", "2019-09-17"],
    [85.0, 81.0, 85.0, 85.0, 83.0, 85.5]
], [
    ["2019-09-09", "2019-09-10", "2019-09-11", "2019-09-12", "2019-09-13", "2019-09-14", "2019-09-15", "2019-09-16", "2019-09-17", "2019-09-18", "2019-09-19", "2019-09-20", "2019-09-21", "2019-09-22"],
    ["2019-09-10", "2019-09-11", "2019-09-12", "2019-09-13", "2019-09-15", "2019-09-17", "2019-09-18", "2019-09-19", "2019-09-20", "2019-09-21"],
    [85.0, 81.0, 85.0, 85.0, 83.0, 85.5, 85.0, 86.0, 85.0, 84.5]
], [
    ["2019-09-09", "2019-09-10", "2019-09-11", "2019-09-12", "2019-09-13", "2019-09-14", "2019-09-15", "2019-09-16", "2019-09-17", "2019-09-18", "2019-09-19", "2019-09-20", "2019-09-21", "2019-09-22"],
    ["2019-09-10", "2019-09-11", "2019-09-12", "2019-09-13", "2019-09-15", "2019-09-16", "2019-09-17", "2019-09-18", "2019-09-19", "2019-09-20", "2019-09-21"],
    [85.0, 81.0, 85.0, 85.0, 83.0, 83.5, 85.5, 85.0, 85.0, 85.0, 84.5]
], [
    ["2019-09-30", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04", "2019-10-05", "2019-10-06"],
    ["2019-10-01", "2019-10-05", "2019-10-06"],
    [84.0, 85.5, 85.0],
]];

for (let test of tests) console.log(JSON.stringify(getGaps(...test)));

这里有 6 个测试用例。您在问题中首先提出的那个,以及您一起列出的其他 4 个示例,以及您在下面的 cmets 中提到的另一个案例。

第二种情况的输出(你的4块中的第一个)在最终数字上有所不同,但我的理解应该是这样的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-10-27
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多