这里是一个解决方案:
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次的工作(如果新阵列是完全唯一的,因为它必须搜索newDownloadedArray
中的每一个的所有30个currentArrayObjects
)。
但这在浏览器方面并不是很多。你可以做很多工作来加速它。例如,而不是在谓语通过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]);
}
}
谢谢您的回答!为了记录,我选择了将自己阵列中的所有注册存储的路线,以保持简单。这确实意味着必须管理另一个单独的阵列,但我认为出于速度和组织的目的,这是此场景的绝佳选择。 – jskidd3
@ jskidd3您应该查看我添加到第二个解决方案的注释。将注册存储在数组中并不可怕,但您真正想要的是将注册存储在一个集合中 - 搜索数组是O(n);搜索哈希集是恒定的时间。 –