这是一种解决方案:
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]);
}
}