检查数组是否包含具有特定属性值的对象

2023-11-29

我有一个大约 30 个对象的数组。每个对象都有一个称为“注册”的属性。我用注册属性来唯一标识每个对象。每个对象还包含一个时间戳(始终是唯一的)。

每隔 30 秒,我就会从 API 下载这 30 个对象的一个​​新实例。有可能将新对象添加到当前数组中。我需要想出一种方法来检查新对象是否在旧(当前)对象的数组中。如果对象不包含唯一的时间戳,那么这将非常简单,但由于每个实例的时间戳都不同,所以这将不起作用。

到目前为止我所拥有的:

newDownloadedArray = JSON.parse(newDownloadedArray);

for (var i = 0; i < currentArrayObjects.length; i++) {
    for (var j = 0; j < newDownloadedArray.length; j++) {

         /* 
         *  This is where I'm stuck.
         *  I now need to check if newDownloadedArray[j].registration is
         *  the value of any registration property inside the currentArrayObjects
         *  array.
         *
         *  If it is, then I know this is a new object.
         */

    }
}

这是一种解决方案:

var isNewObject = function(newObject) {
    return !currentArrayObjects.some(function(currentObject) {
        return newObject.registration == currentObject.registration;
    });
};
var onlyNewObjects = newDownloadedArray.filter(isNewObject);

我们基本上是在说“对于其中的每个对象newDownloadedArray,查看中的每个对象currentArrayObjects直到找到一个匹配的registration。如果这样做,该对象将包含在onlyNewObjects。如果你不这样做,那就不是。

注意Array.prototype.filter and Array.prototype.some仅在 IE 9+ 中可用,因此您可能需要使用等效的帮助方法或实用程序库(例如下划线)如果您想支持旧版浏览器。

这不是很有效。对于 30 个项目的数组,我们在最坏的情况下执行 900 次(如果新数组完全唯一,因为它必须搜索所有 30 个项目)currentArrayObjects对于每一个newDownloadedArray).

但就浏览器而言,这并不是很多。您可以做很多事情来加快速度。例如,不要搜索currentArrayObjects在谓词中,我们可以构建一个包含所有注册的对象:

// We want a set of registrations, but JavaScript doesn't
// have a native set class, so we're going to use the keys 
// of an object to simulate sets, because object keys are
// basically sets of strings. Note that this won't work if
// registration isn't a string.
var currentRegistrations = {};
currentArrayObjects.forEach(function(currentObject) {
    // AKA currentRegistrationSet.add(currentObject.registration) if we
    // had an actual set class. I chose 'true' somewhat at random
    // because it felt right; we'll never actually be accessing
    // the value.
    currentRegistrations[currentObject.registration] = true;
});
var isNewObject = function(newObject) {
    // AKA !currentRegistrationSet.contains(newObject.registration) if we
    // had an actual set class.
    return !currentRegistrations.hasOwnProperty(newObject.registration);
}
var onlyNewObjects = newDownloadedArray.filter(isNewObject);

(同样的警告Array.prototype.forEach)

现在我们只需要执行大约 60 项操作——其中 30 项用于提前构建对象,另外 30 项用于检查每项操作。


您的解决方案与我发布的第一个解决方案相差不远。但你切换了for循环。它可能是:

newDownloadedArray = JSON.parse(newDownloadedArray);

var onlyNewObjects = []
for (var i = 0; i < newDownloadedArray.length; i++) {
    var isNewObject = true;
    for (var j = 0; j < currentArrayObjects.length; j++) {
        if (newDownloadedArray[i].registration == currentArrayObjects[j].registration) {
            isNewObject = false;

            break; // no reason to keep looking; we know it isn't new
        }
    }
    if (isNewObject) {
        onlyNewObjects.push(newDownloadedArray[i]);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查数组是否包含具有特定属性值的对象 的相关文章

  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 按搜索值过滤元素 - 多个单词

    我有一个由 DIV 和 INPUT 搜索框组成的列表
  • jQuery AJAX 请求在 IE8 中失败,并显示消息“错误:调用 open 方法之前无法调用此方法。”

    我正在使用 jQuery 1 4 2 并尝试执行一个简单的 AJAX 请求 目标 URL 返回一个 JSON 字符串 我使用 jslint 对其进行了验证 该请求在 Firefox 和 Chrome 中有效 但不想在 IE8 中工作 我无法
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro
  • 循环内的异步性

    我正在使用 jQuery getJSON 用于从一组实用程序的给定 URL 检索数据的 API 我真的很想找到一种为每个实用程序重用代码 完全相同 的方法 由于循环的执行与 ajax 调用无关 因此我无法找到保留循环值的方法 我知道这个描述

随机推荐