JavaScript Object Management
Creating, copying, merging, and manipulating objects
🛠️ What is Object Management?
Object management involves creating, copying, merging, and manipulating objects efficiently. It's essential for building complex applications where you need to work with data structures.
// Basic object management
let user = {name: "Alice", age: 25};
let userCopy = {...user}; // Spread operator for copying
Object Management Techniques
Creating Objects
Different ways to create objects
let obj = {};
let obj2 = new Object();
let obj3 = Object.create(null);
Copying Objects
Shallow and deep copying
let copy = {...original};
let deepCopy = JSON.parse(JSON.stringify(original));
Merging Objects
Combine multiple objects
let merged = Object.assign({}, obj1, obj2);
let merged2 = {...obj1, ...obj2};
Deleting Properties
Remove object properties
delete obj.property;
let {unwanted, ...rest} = obj;
🔹 Creating Objects
Multiple ways to create objects in JavaScript:
// Method 1: Object literal (most common)
let person1 = {
name: "John",
age: 30,
greet: function() {
return "Hello, I'm " + this.name;
}
};
// Method 2: Object constructor
let person2 = new Object();
person2.name = "Jane";
person2.age = 25;
// Method 3: Object.create()
let personPrototype = {
greet: function() {
return "Hi, I'm " + this.name;
}
};
let person3 = Object.create(personPrototype);
person3.name = "Bob";
person3.age = 35;
// Method 4: Constructor function
function Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
return "Hey, I'm " + this.name;
};
}
let person4 = new Person("Alice", 28);
console.log(person1.greet()); // "Hello, I'm John"
console.log(person3.greet()); // "Hi, I'm Bob"
console.log(person4.greet()); // "Hey, I'm Alice"
Output:
Hello, I'm John
Hi, I'm Bob
Hey, I'm Alice
🔹 Copying Objects
Understanding shallow vs deep copying:
let original = {
name: "Sarah",
age: 30,
address: {
city: "New York",
country: "USA"
},
hobbies: ["reading", "swimming"]
};
// Shallow copy - only copies first level
let shallowCopy1 = {...original};
let shallowCopy2 = Object.assign({}, original);
// Modify nested object
shallowCopy1.address.city = "Los Angeles";
console.log("Original city:", original.address.city); // "Los Angeles" (affected!)
// Deep copy - copies all levels
let deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.address.country = "Canada";
console.log("Original country:", original.address.country); // "USA" (not affected)
// Better deep copy function
function deepClone(obj) {
if (obj === null || typeof obj !== "object") return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof Array) return obj.map(item => deepClone(item));
let cloned = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloned[key] = deepClone(obj[key]);
}
}
return cloned;
}
let properDeepCopy = deepClone(original);
console.log("Deep copy works:", properDeepCopy.name); // "Sarah"
Output:
Original city: Los Angeles
Original country: USA
Deep copy works: Sarah
🔹 Merging Objects
Combine multiple objects into one:
let defaults = {
theme: "light",
language: "en",
notifications: true
};
let userPrefs = {
theme: "dark",
fontSize: "large"
};
let adminSettings = {
permissions: "admin",
notifications: false
};
// Method 1: Object.assign() (modifies first object)
let config1 = Object.assign({}, defaults, userPrefs, adminSettings);
// Method 2: Spread operator (creates new object)
let config2 = {...defaults, ...userPrefs, ...adminSettings};
// Method 3: Custom merge function
function mergeObjects(...objects) {
return objects.reduce((result, obj) => {
return {...result, ...obj};
}, {});
}
let config3 = mergeObjects(defaults, userPrefs, adminSettings);
console.log("Merged config:");
console.log(config2);
// Conditional merging
let finalConfig = {
...defaults,
...(userPrefs.theme && {theme: userPrefs.theme}),
...(adminSettings.permissions && {permissions: adminSettings.permissions})
};
console.log("Conditional merge:");
console.log(finalConfig);
Output:
Merged config:
{theme: "dark", language: "en", notifications: false, fontSize: "large", permissions: "admin"}
Conditional merge:
{theme: "dark", language: "en", notifications: true, permissions: "admin"}
🔹 Adding and Removing Properties
Dynamically modify object properties:
let product = {
name: "Laptop",
price: 999
};
// Adding properties
product.brand = "Dell";
product["warranty"] = "2 years";
product.specs = {ram: "16GB", storage: "512GB"};
console.log("After adding:", product);
// Removing properties
delete product.warranty;
console.log("After deleting warranty:", product);
// Destructuring to remove (creates new object)
let {price, ...productWithoutPrice} = product;
console.log("Without price:", productWithoutPrice);
console.log("Removed price:", price);
// Conditional property addition
let isOnSale = true;
let productListing = {
...product,
...(isOnSale && {salePrice: 799, discount: "20%"})
};
console.log("Product listing:", productListing);
// Bulk property management
let updates = {
category: "Electronics",
inStock: true,
rating: 4.5
};
Object.assign(product, updates);
console.log("After bulk update:", product);
Output:
After adding: {name: "Laptop", price: 999, brand: "Dell", warranty: "2 years", specs: {ram: "16GB", storage: "512GB"}}
After deleting warranty: {name: "Laptop", price: 999, brand: "Dell", specs: {ram: "16GB", storage: "512GB"}}
Without price: {name: "Laptop", brand: "Dell", specs: {ram: "16GB", storage: "512GB"}}
Removed price: 999
Product listing: {name: "Laptop", price: 999, brand: "Dell", specs: {ram: "16GB", storage: "512GB"}, salePrice: 799, discount: "20%"}
After bulk update: {name: "Laptop", price: 999, brand: "Dell", specs: {ram: "16GB", storage: "512GB"}, category: "Electronics", inStock: true, rating: 4.5}
🔹 Object Comparison and Validation
Compare and validate objects:
// Object comparison
function objectsEqual(obj1, obj2) {
let keys1 = Object.keys(obj1);
let keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
return false;
}
for (let key of keys1) {
if (obj1[key] !== obj2[key]) {
return false;
}
}
return true;
}
let user1 = {name: "John", age: 30};
let user2 = {name: "John", age: 30};
let user3 = {name: "Jane", age: 25};
console.log("user1 equals user2:", objectsEqual(user1, user2)); // true
console.log("user1 equals user3:", objectsEqual(user1, user3)); // false
// Object validation
function validateUser(user) {
let required = ["name", "email", "age"];
let missing = required.filter(field => !(field in user));
if (missing.length > 0) {
return {valid: false, missing: missing};
}
if (typeof user.age !== "number" || user.age < 0) {
return {valid: false, error: "Age must be a positive number"};
}
return {valid: true};
}
let testUser1 = {name: "Alice", email: "[email protected]", age: 25};
let testUser2 = {name: "Bob", age: -5};
console.log("User1 validation:", validateUser(testUser1));
console.log("User2 validation:", validateUser(testUser2));
Output:
user1 equals user2: true
user1 equals user3: false
User1 validation: {valid: true}
User2 validation: {valid: false, missing: ["email"]}