Open In App

Extract unique objects by attribute from array of objects

Last Updated : 09 Apr, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of objects and the task is to return the unique object by the attribute. 

Examples:

Input: 
[
{ name: 'Geeks', id: 10 },
{ name: 'GeeksForGeeks', id: 10 },
{ name: 'Geeks', id: 20 },
{ name: 'Geeks', id: 10 }
]
Output:
[
{ name: 'Geeks', id: 10 },
{ name: 'GeeksForGeeks', id: 10 }
]

Approach: Let’s assume that name is an attribute that differentiates the objects and needs the object with a minimum id number if multiple objects exist for the same name. Use the map to store objects and check whether similar objects were seen or not.

  • Initialize an empty map.
  • Iterate through the array using the filter() method.
  • Check if there is any entry in the map with the same name as of current object.
    • If true: i.e. there exists an entry with the same name then, check if its id is less than the current object’s id.
      • If true: i.e current object’s id is less than the id of the object returned by the map then delete the map entry and enter the current object and return true.
      • if false: i.e. id of the current object is greater than the id of the object returned by the map then return false.
    • If false: i.e. there is no entry in a map with the same name then enter the current object into the map.
  • Print unique objects.

Example: In this example, we will extract unique objects by attribute from an array of objects.

Java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UniqueObjectsFilter {
    public static void main(String[] args) {
        // Given objects array
        List<Map<String, Object>> objects = new ArrayList<>();
        objects.add(Map.of("name", "Geeks", "id", 10));
        objects.add(Map.of("name", "GeeksForGeeks", "id", 10));
        objects.add(Map.of("name", "Geeks", "id", 20));
        objects.add(Map.of("name", "Geeks", "id", 10));

        // Initialize a map to store the minimum 'id' for each 'name'
        Map<String, Integer> myMap = new HashMap<>();

        // Initialize a list to store unique objects
        List<Map<String, Object>> unique = new ArrayList<>();

        // Loop through each object in the 'objects' list
        for (Map<String, Object> el : objects) {
            // Check if 'name' is already in the map
            if (myMap.containsKey(el.get("name"))) {
                // If yes, compare the current 'id' with the stored minimum 'id'
                if ((int) el.get("id") < myMap.get(el.get("name"))) {
                    // If the current 'id' is smaller, update the minimum 'id' in the map
                    myMap.put((String) el.get("name"), (int) el.get("id"));
                    // Add the current object to the list of unique objects
                    unique.add(el);
                }
            } else {
                // If 'name' is not in the map, add it with the current 'id'
                myMap.put((String) el.get("name"), (int) el.get("id"));
                // Add the current object to the list of unique objects
                unique.add(el);
            }
        }

        // Print the list of unique objects
        System.out.println(unique);
    }
}
Python3
# Given JavaScript code to filter unique objects based on 'name' with the minimum 'id'
objects = [
    {"name": "Geeks", "id": 10},
    {"name": "GeeksForGeeks", "id": 10},
    {"name": "Geeks", "id": 20},
    {"name": "Geeks", "id": 10}
]

# Initialize an empty dictionary to store the minimum 'id' for each 'name'
mymap = {}

# Initialize an empty list to store unique objects
unique = []

# Loop through each object in the 'objects' array
for el in objects:
    # Check if 'name' is already in the dictionary
    if el["name"] in mymap:
        # If yes, compare the current 'id' with the stored minimum 'id'
        if el["id"] < mymap[el["name"]]:
            # If the current 'id' is smaller, update the minimum 'id' in the dictionary
            mymap[el["name"]] = el["id"]
            # Add the current object to the list of unique objects
            unique.append(el)
    else:
        # If 'name' is not in the dictionary, add it with the current 'id'
        mymap[el["name"]] = el["id"]
        # Add the current object to the list of unique objects
        unique.append(el)

# Print the list of unique objects
print(unique)
javascript
let objects = [{
    name: 'Geeks',
    id: 10
}, {
    name: 'GeeksForGeeks',
    id: 10
}, {
    name: 'Geeks',
    id: 20
}, {
    name: 'Geeks',
    id: 10
}];

let mymap = new Map();

let unique = objects.filter(el => {
    const val = mymap.get(el.name);
    if (val) {
        if (el.id < val) {
            mymap.delete(el.name);
            mymap.set(el.name, el.id);
            return true;
        } else {
            return false;
        }
    }
    mymap.set(el.name, el.id);
    return true;
});

console.log(unique);

Output
[ { name: 'Geeks', id: 10 }, { name: 'GeeksForGeeks', id: 10 } ]



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads