Хотя верный ответ на этот вопрос правильный и хороший, предоставленный код может использовать некоторые улучшения.
Ниже приведен мой собственный код для сравнения массивов и объектов. Код является коротким и простым:
Array.prototype.equals = function(otherArray) {
if (!otherArray || this.length != otherArray.length) return false;
return this.reduce(function(equal, item, index) {
var otherItem = otherArray[index];
var itemType = typeof item, otherItemType = typeof otherItem;
if (itemType !== otherItemType) return false;
return equal && (itemType === "object" ? item.equals(otherItem) : item === otherItem);
}, true);
};
if(!Object.prototype.keys) {
Object.prototype.keys = function() {
var a = [];
for (var key in this) {
if (this.hasOwnProperty(key)) a.push(key);
}
return a;
}
Object.defineProperty(Object.prototype, "keys", {enumerable: false});
}
Object.prototype.equals = function(otherObject) {
if (!otherObject) return false;
var object = this, objectKeys = object.keys();
if (!objectKeys.equals(otherObject.keys())) return false;
return objectKeys.reduce(function(equal, key) {
var value = object[key], otherValue = otherObject[key];
var valueType = typeof value, otherValueType = typeof otherValue;
if (valueType !== otherValueType) return false;
// this will call Array.prototype.equals for arrays and Object.prototype.equals for objects
return equal && (valueType === "object" ? value.equals(otherValue) : value === otherValue);
}, true);
}
Object.defineProperty(Object.prototype, "equals", {enumerable: false});
Этот код поддерживает массивы, вложенные в объекты, и объекты, вложенные в массивы.
Вы можете увидеть полный набор тестов и самостоятельно протестировать код в этом репл: https://repl.it/Esfz/3
Флеш-накопители печально не служат навсегда, они могут легко перестать работать и стать неприменимыми или даже немонтируемыми... Попробуйте свою карту флэш-памяти в различном USB-порту, затем в другом компьютере полностью, чтобы удостовериться, что это - карта флэш-памяти, это - проблема..