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"]}

🧠 Test Your Knowledge

What's the difference between shallow and deep copying?