我有大约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
并且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] 删除。
我来说两句