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

jskidd3

我有大约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.
         */

    }
}
伊恩·亨利(Ian Henry)

这是一种解决方案:

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并且Array.prototype.some仅在IE 9+中可用,因此如果要支持较旧的浏览器,则可能要使用等效的帮助程序方法或实用程序库(例如underscore)。

这不是很有效。对于包含30个项目的数组,我们在最坏的情况下进行了900次工作(如果新数组是完全唯一的,因为它必须currentArrayObjects针对的每个数组搜索全部30个数组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]);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

JavaScript / VueJS:检查数组是否包含对象,该对象的元素具有特定值

MongoDB 对象属性检查 $exists 是否在嵌套数组中具有特定值

如何检查对象数组是否具有具有更多属性的重复属性值?

检查自定义对象数组是否包含具有特定日期的对象

如何放置角度模板以检查特定数组是否包含对象的属性等于某个值?

角度检查数组是否包含具有特定变量值的对象

检查数组是否在Elastic Search中包含具有特定字段的对象?

如何检查List <T>元素是否包含具有特定属性值的项目

检查订单是否包含具有特定属性值 Woocommerce 的产品

如何过滤对象数组并检查特定键是否在数组中具有值

Spring MongoDB Criteria:如何检查列表是否存在并包含具有特定值的对象?

Python 3:检查列表是否包含具有特定字符串值的对象

Swift-检查数组是否包含具有属性的元素

Angular 2 / Typescript - 如何检查对象数组以查看属性是否具有相同的值?

如何检查对象数组是否具有重复的属性值?

检查Javascript数组中是否存在具有属性值“ x”的对象

JSON模式:如何检查一个数组是否包含至少一个具有给定值属性的对象?

获取所有具有包含特定值的数组的对象

如何检查日期数组是否具有内部对象数组特定值的值并推送到新数组

PHP检查数组中是否存在具有属性的对象

如何检查 R 对象是否具有特定属性?

如何知道数组是否包含具有特定“键”的对象?

PHP:如何检查对象的属性是否具有值?

确定PSCustomObject的数组是否包含具有属性值的实例

如何检查对象数组是否具有相同的值

JSON模式:如何检查具有特定值的每个数组项是否具有必需的属性?

检查列表中是否存在具有特定值的对象