Comparing and cloning objects in JavaScript
Here’s a handy way to determine if two JavaScript objects are identical without using a framework like jQuery or MooTools:
var compare_objects = function (obj1, obj2) {
var parameter_name;
var compare = function (objA, objB, param) {
var param_objA = objA[param],
param_objB = typeof objB[param] === "undefined" ? false : objB[param];
switch (typeof objA[param]) {
case "object":
return compare_objects(param_objA, param_objB);
case "function":
return param_objA.toString() === param_objB.toString();
default:
return param_objA === param_objB;
}
};
for (parameter_name in obj1) {
if (
typeof obj2[parameter_name] === "undefined" ||
!compare(obj1, obj2, parameter_name)
) {
return false;
}
}
for (parameter_name in obj2) {
if (
typeof obj1[parameter_name] === "undefined" ||
!compare(obj1, obj2, parameter_name)
) {
return false;
}
}
return true;
};
Here’s an easy way to clone a JavaScript object:
var clone_object = function (original_obj) {
var new_obj = {};
for (var param in original_obj) {
if (original_obj.hasOwnProperty(param)) {
if (typeof original_obj[param] === "object") {
new_obj[param] = clone_object(original_obj[param]);
} else {
new_obj[param] = original_obj[param];
}
}
}
return new_obj;
};
A real-world example of the two functions:
var object_1 = { fruit: "apple", tree: "dogwood", number: 3 };
var object_2 = {
fruit: "apple",
tree: "dogwood",
number: 3,
cartoons: { anime: "robotech", fantasy: "he-man" },
};
var object_3 = clone_object(object_2);
console.log("objects 1 and 2 match? " + compare_objects(object_1, object_2)); //displays false; console.log("objects 2 and 3 match? " +compare_objects(object_2, object_3)); //displays true
Bear in mind both of these functions are recursive, which means the larger the object, the slower the performance.