使用 JavaScript 查找数组中最接近的日期

2024-06-30

我有一个包含天数的数组。每一天都是一个对象,例如:

{day_year: "2012", day_month: "08", day_number: "03", day_name: "mon"}

我还通过使用以下方法向每个日期对象添加了时间戳属性:

function convertDays() {
    var max_i = days.length;
    for(var i = 0; i < max_i; i++) {
        var tar_i = days[i];
        tar_i.timestamp = new Date(tar_i.day_year, tar_i.day_month, tar_i.day_number);
    }
}

数组中的日期是任意的,因此它们没有真正的逻辑。

现在我想找到距离任何给定日期最近的两天。因此,如果包含 days 的数组包含

  • 2012 年 8 月 2 日
  • 2012 年 8 月 4 日
  • 2012 年 8 月 23 日

我搜索2012年8月11日,我希望它返回2012年8月4日和2012年8月23日。

我尝试使用另一个问题的答案,如下所示:

function findClosest(a, x) {
    var lo, hi;
    for(var i = a.length; i--;) {
        if(a[i] <= x && (lo === undefined || lo < a[i])) lo = a[i];
        if(a[i] >= x && (hi === undefined || hi > a[i])) hi = a[i];
    }
    return [lo, hi];
}

然而,这返回unidentified.

实现这一目标的最有效(处理器/内存占用最少的方式)是什么?

编辑:“但是,这些结果怎么“奇怪”?你能提供一个代码和数据的示例吗?”

我现在使用以下命令生成日期数组:

var full_day_array = [];
for(var i = 0; i < 10; i++) {
    var d = new Date();
    d.setDate(d.getDate() + i);
    full_day_array.push({day_year: d.getFullYear().toString(), day_month: (d.getMonth() + 1).toString(), day_number: d.getDate().toString()});
}

奇怪的是,使用下面的代码,这只适用于 10 个或更短日期的数组。每当我使用包含 11 个或更多日期的数组时,结果都会变得意想不到。

例如:使用 15 个日期的数组,从 2012 年 8 月 6 日开始到 2012 年 8 月 21 日。如果我随后调用findClosest(full_day_array, new Date("30/07/2012");你会期望它返回{nextIndex: 0, prevIndex: -1}。然而,它返回{nextIndex: 7, prevIndex: -1}. Why?

function findClosest(objects, testDate) {
    var nextDateIndexesByDiff = [],
        prevDateIndexesByDiff = [];

    for(var i = 0; i < objects.length; i++) {
        var thisDateStr = [objects[i].day_month, objects[i].day_number, objects[i].day_year].join('/'),
            thisDate    = new Date(thisDateStr),
            curDiff     = testDate - thisDate;

        curDiff < 0
            ? nextDateIndexesByDiff.push([i, curDiff])
            : prevDateIndexesByDiff.push([i, curDiff]);
    }

    nextDateIndexesByDiff.sort(function(a, b) { return a[1] < b[1]; });
    prevDateIndexesByDiff.sort(function(a, b) { return a[1] > b[1]; });


    var nextIndex;
    var prevIndex;

    if(nextDateIndexesByDiff.length < 1) {
        nextIndex = -1;
    } else {
        nextIndex = nextDateIndexesByDiff[0][0];
    }
    if(prevDateIndexesByDiff.length < 1) {
        prevIndex = -1;
    } else {    
        prevIndex = prevDateIndexesByDiff[0][0];
    }
    return {nextIndex: nextIndex, prevIndex: prevIndex};
}

您可以轻松地使用sort功能 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort使用自定义比较器功能:

// assuming you have an array of Date objects - everything else is crap:
var arr = [new Date(2012, 7, 1), new Date(2012, 7, 4), new Date(2012, 7, 5), new Date(2013, 2, 20)];
var diffdate = new Date(2012, 7, 11);

arr.sort(function(a, b) {
    var distancea = Math.abs(diffdate - a);
    var distanceb = Math.abs(diffdate - b);
    return distancea - distanceb; // sort a before b when the distance is smaller
});

// result:
[2012-08-05, 2012-08-04, 2012-08-01, 2013-03-20]

仅获取之前或之后的结果diffdate, 你可以filter https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter数组:

var beforedates = arr.filter(function(d) {
    return d - diffdate < 0;
}),
    afterdates = arr.filter(function(d) {
    return d - diffdate > 0;
});

如果您有自定义数组{the_date_object: new Date(...)}对象,您将需要调整排序算法

    var distancea = Math.abs(diffdate - a.the_date_object);
    var distanceb = Math.abs(diffdate - b.the_date_object);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 查找数组中最接近的日期 的相关文章

  • 异步等待和获取语法在 React 中不起作用

    这是我的代码 export class App extends Component constructor props super props async fetchSport sport let headers new Headers h
  • 为什么动态安装的 vuejs 内容不是根 vue 实例的子组件?

    我加载一些包含自定义组件的 html 并将该内容挂载到父组件中的固定节点 不幸的是 我发现它们之间没有父子关系 因此动态插入的组件派发的事件无法被根vue接收 我创建了一把小提琴 任何帮助或建议都将受到赞赏 http jsfiddle ne
  • 在 Bootstrap 中的悬停中打开折叠选项卡

    我在 Bootstrap 中有折叠面板 单击选项卡标题即可打开该面板 我试图弄清楚如何使用鼠标悬停在选项卡的总宽度上来打开 但我没有得到它 下面是默认关闭的单个选项卡的代码 div class panel panel default sty
  • 使用正则表达式搜索 github 存储库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用正则表达式搜索我公司的github源网站 无论如何这可能吗 AFAIK 你需要自己设置 Github有自己的搜索语法 http
  • 无法使用带有 socket.io 的媒体源从媒体记录器跳转到流

    当首先加载视频观察客户端然后加载网络摄像头客户端时 以下代码可以正常工作 但是 如果顺序交换或以任何方式中断流 例如通过刷新任一客户端 则流将失败并且媒体源会将其就绪状态更改为关闭 我的假设是 在开始时接收的视频需要初始化标头才能启动 并且
  • WKScriptMessageHandler 不会侦听网页上按钮元素上的“onclick”或“click”事件。网页是使用Reactjs开发的

    我正在使用一个WKWebView在 UIViewController 的视图中使用 url 端点显示托管在服务器上的网页 该网页使用Reactjs 这就是我所掌握的有关该网页的所有信息 该代码创建一个 Web 视图并将该 Web 视图作为控
  • React Native 上无法识别的字体系列

    我在使用 React Native 时遇到了一个特殊的错误 在我的里面button js我在做 import Icon from react native vector icons MaterialIcons const icon Icon
  • javascript 检查 json 中是否为 null

    我使用以下 JavaScript 它写得很好 直到得到没有值的结果 在控制台日志中它显示了这一点 未捕获的类型错误 无法读取 null 的属性 文本 但我下面的脚本似乎不起作用 var checkCaption photo caption
  • 引导崩溃仅切换一次

    我再次在这里拉扯我的头发 所以我已经使用 jsFiddle 进行了引导崩溃 http jsfiddle net rasreye xtPtH 1 http jsfiddle net rasreye xtPtH 1 但是当我添加到我的网站时 它
  • 将元素粘贴到滚动上固定元素的底部?

    基本上 我想要实现的目标是让辅助导航在滚动时与主导航的底部相遇后立即粘在主导航的底部 我仍在学习 jQuery 并且我已经开始抓狂了 编辑 意识到我没有解释到目前为止我已经到了哪里 该类被添加到元素中 但是它没有固定在主标题下方 而是从视口
  • 文件上传:完成百分比进度条

    我正在尝试为头像上传添加 到目前为止完成的百分比 进度条巴迪出版社 https github com buddypress BuddyPress 目的是阻止用户在上传完成之前离开页面 上传过程由 BuddyPress 处理bp core a
  • JavaScript 可以在重新加载后保持任何状态吗?

    有没有办法让 JavaScript 通过重新加载来保存任何变量 如果用户点击重新加载按钮 一旦页面重新加载 JavaScript 是否会保留任何状态 建议 Cookie HTML 5 网络存储https www w3schools com
  • 硒元素不相互作用

    我开始使用selenium node js 到目前为止一切正常 突然相同的脚本抛出错误 未处理的承诺拒绝警告元素不可交互 我尝试设置等待 直到什么也没有
  • 点运算符不获取 Mongoose Document 对象的子属性

    console log gt gt gt gt gt gt user user outputs gt gt gt gt gt gt user username user1 salt 3303187e50a64889b41a7a1c66d3d
  • 邪恶的 Firefox 错误——“底层对象不支持参数或操作”

    我想弄清楚这里发生了什么事 我已经研究了几个小时了 似乎无法理解为什么会发生这种情况 我正在进行一些 AJAX 调用 但仅在 Mac OS X 上的 Firefox 版本 21 中不断收到此错误 这是错误 Exception A param
  • Next.js 切换 div 标签的显示

    Code export default function Header let showMe false function toggle showMe showMe return lt gt
  • Tensorflow.js 与 React-Native

    我知道tensor flow js是一个以网络为中心的库 但出于好奇 我也在react native上尝试了它 它有点有效 它仅适用于调试模式 并在调试模式关闭时抛出错误 错误说窗口 位置 搜索不是一个对象 经过一些研究 我发现窗口对象是在
  • 用javascript去掉未使用的小数

    我有一个货币输入 只需要返回有效数字 输入始终有两位小数 因此 4 00 gt 4 4 10 gt 4 1 4 01 gt 4 01 这是我目前正在做的事情 chop off unnecessary decimals if val char
  • PHP 使用破折号箭头“->”检索数组值

    我已经使用 PHP 有一段时间了 但从来都不是一个高级程序员 我觉得这是一个愚蠢的问题 但从未理解为什么可以使用不同的方法检索某些数组值 This array gt value 而不是正常的 array value 标准 array val
  • 使重复的scrollBy像jQuery的动画scrollTop一样平滑

    如何使重复的scrollBy调用更平滑 就像使用jQuery的animatescrollTop制作动画一样 目前它是跳跃的 页面在不同的滚动位置之间跳转 我怎样才能让它更顺畅 这是滚动代码 window scrollBy 0 10 scro

随机推荐

  • 用于获取唯一元素名称的 XPath

    我想使用 XPath 获取 XML 文件中出现的所有元素的名称列表 但是 我不希望任何名称重复 因此不应匹配与前面的元素具有相同名称的元素 到目前为止 我已经得到 not local name local name preceding 这执
  • 伪造数据库时,Effort-FirstOrDefault 返回 null

    我正在尝试为我的项目创建一些单元测试 经过大量挖掘后 我发现了 Effort 这个想法很棒 它模拟数据库而不是处理伪造 DBContext 顺便说一句 当使用复杂的模式 但是 在我专门将用户的电子邮件添加到 Effort 创建的内存数据库中
  • Swift 中的等效 android.content.BroadcastReceiver

    我想知道 Swift 中是否有等效的 android content BroadcastReceiver 我需要相同的处理程序 例如onReceive Context context Intent intent 有可能的 谢谢 Ysee 在
  • 使用 Kafka 进行一对一和群组消息传递

    由于 Kafka 具有基于主题的发布 订阅架构 我如何使用 Kafka 处理 Web 应用程序的一对一和组消息传递部分 我正在使用 SpringBoot Angular 堆栈和 Docker Kafka 服务器 我会在这里写另一个答案 根据
  • 使用 Eclipse Kepler 和 Struts 2 + Tomcat 7 时出现资源不可用错误

    好的 这是我用 Java 编写的第一个应用程序 也是我第一次使用 Eclipse Kepler Tomcat 7 和 Struts2 所以我很惊讶我竟然能走到这一步 因为我只知道 JS 和 Rails 不管怎样 这个基本的网络应用程序实际上
  • 获得熊猫按群体连续几周的最长连续记录

    目前我正在处理不同主题的每周数据 但可能会有一些没有数据的长连续 所以 我想做的就是保留每个连续几周的最长连续id 我的数据如下所示 id week 1 8 1 15 1 60 1 61 1 62 2 10 2 11 2 12 2 13 2
  • HTML5 Canvas - 在画布上绘图、保存上下文并稍后恢复

    要求 现在 在画布上绘制 然后点击 保存 存储画布状态 离线绘制 但不作为图像 稍后 打开画布并显示之前保存的绘图 然后继续再次绘制 对于绘图 我们通常使用如下代码 canvas document getElementById can ct
  • 工厂函数方法不更新变量

    我正在尝试设置一个工厂函数 该函数将更新所述工厂函数中特定变量的值 这看起来实现起来很简单 但是 每当我测试它时 我都会得到变量的原始设置值 而不是更新后的值 我确信在范围界定方面我缺少一些细微差别 但这里到底发生了什么 const fac
  • 引用初始化中正在初始化的对象?

    我有一个对象 Data ParameterInfo DPI 它带有几个委托方法 用于将数据从 DataReader 移动到 POCO 或从 POCO 中获取值 Example new DataParameterInfo
  • JSF / 多巴哥 Facets 列表?

    有谁知道所有现有 JSF Tobago 方面的列表的良好链接 其中包含该方面的用途的解释 到目前为止 我知道 布局 和 确认 方面 但我还没有找到一个网站显示所有其他现有方面 提前致谢 通常 各个标签的文档都有其方面的描述 例如 http
  • 读取输入消息时出现 I/O 错误;嵌套异常是 java.io.IOException:流已关闭

    这是我的控制器 RestController RequestMapping reclamacao public class ClaimController Autowired private ClaimRepository claimRep
  • del 在 Python 中什么时候有用?

    我实在想不出为什么 Python 需要del关键字 大多数语言似乎没有类似的关键字 例如 我们可以分配一个变量 而不是删除一个变量None到它 当从字典中删除时 del可以添加方法 有理由保留吗del在Python中 还是Python前垃圾
  • 为什么Python中的打印需要三个撇号?

    我正在用 Python 3 3 2 制作这个毕达哥拉斯定理计算器 我打印了几行 以便我可以制作图表 print Welcome to the Pythagoras Theorem Calculator powered by Python p
  • Flutter 错误:无法下载 bcprov-jdk15on.jar (org.bouncycastle:bcprov-jdk15on:1.56)

    我无法运行我的第一个 Flutter 应用程序 出现以下错误 Launching lib main dart on Android SDK built for x86 in debug mode Initializing gradle Re
  • Python 解码 JSON 中的嵌套 JSON

    我正在处理一个 API 不幸的是它返回了格式错误 或 奇怪的格式 而是 感谢 fjarri JSON 但从积极的一面来看 我认为这可能是我学习一些有关递归以及JSON 这是我用来记录锻炼的应用程序 我正在尝试制作备份脚本 我可以很好地收到
  • Visual Studio 功能 - 注释代码 Ctrl K - Ctrl C

    我评论过这个答案 https stackoverflow com questions 100420 hidden features of visual studio 2005 2008 129876 129876前段时间关于 Visual
  • 在 build.gradle 文件中添加 buildFeatures 时出错

    我正在尝试 compose 这是 Android jetpack 中的一项新功能 下面是我的代码 我在应用程序的 build gradle 文件中添加 buildfeatures 而不是在根文件夹中 android compileSdkVe
  • 无法使用 OpenCV 访问网络摄像头

    我在 win 7 64 位电脑上使用 OpenCV 2 2 和 Visual Studio 2010 我可以按照 学习 OpenCV 一书中的规定通过 OpenCV 显示图片并播放 AVI 文件 但无法捕获网络摄像头图像 即使随 OpenC
  • Bazel,我想避免生成所有“方便的符号链接”

    当您构建 Bazel 项目时 您的 WORKSPACE 项目根目录会填充一堆方便的符号链接
  • 使用 JavaScript 查找数组中最接近的日期

    我有一个包含天数的数组 每一天都是一个对象 例如 day year 2012 day month 08 day number 03 day name mon 我还通过使用以下方法向每个日期对象添加了时间戳属性 function conver