Extract unique objects by attribute from array of objects
Given an array of objects and the task is to return the unique object by the attribute.
Examples:
Input:
[
{ name: 'Beginner', id: 10 },
{ name: 'w3wiki', id: 10 },
{ name: 'Beginner', id: 20 },
{ name: 'Beginner', id: 10 }
]
Output:
[
{ name: 'Beginner', id: 10 },
{ name: 'w3wiki', 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.
- 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.
- Print unique objects.
Example: In this example, we will extract unique objects by attribute from an array of objects.
#include <iostream>
#include <vector>
#include <unordered_map>
struct Object {
std::string name;
int id;
};
int main() {
std::vector<Object> objects = {
{"Beginner", 10},
{"w3wiki", 10},
{"Beginner", 20},
{"Beginner", 10}
};
std::unordered_map<std::string, int> mymap;
std::vector<Object> unique;
for (const auto& el : objects) {
if (mymap.find(el.name) != mymap.end()) {
if (el.id < mymap[el.name]) {
mymap[el.name] = el.id;
unique.push_back(el);
}
} else {
mymap[el.name] = el.id;
unique.push_back(el);
}
}
for (const auto& obj : unique) {
std::cout << "Name: " << obj.name << ", ID: " << obj.id << std::endl;
}
return 0;
}
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", "Beginner", "id", 10));
objects.add(Map.of("name", "w3wiki", "id", 10));
objects.add(Map.of("name", "Beginner", "id", 20));
objects.add(Map.of("name", "Beginner", "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);
}
}
# Given JavaScript code to filter unique objects based on 'name' with the minimum 'id'
objects = [
{"name": "Beginner", "id": 10},
{"name": "w3wiki", "id": 10},
{"name": "Beginner", "id": 20},
{"name": "Beginner", "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)
let objects = [{
name: 'Beginner',
id: 10
}, {
name: 'w3wiki',
id: 10
}, {
name: 'Beginner',
id: 20
}, {
name: 'Beginner',
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: 'Beginner', id: 10 }, { name: 'w3wiki', id: 10 } ]