Count duplicates within an Array of Objects
Solution 1
For example:
counter = {}
yourArray.forEach(function(obj) {
var key = JSON.stringify(obj)
counter[key] = (counter[key] || 0) + 1
})
Docs: Array.forEach, JSON.stringify.
Solution 2
Object.prototype.equals = function(o){
for(var key in o)
if(o.hasOwnProperty(key) && this.hasOwnProperty(key))
if(this[key] != o[key])
return false;
return true;
}
var array = [/*initial array*/],
newArray = [],
ok = true;
for(var i=0,l=array.length-1;i<l;i++)
for(var j=i;j<l+1;j++)
{
if(!array[i].equals(array[j]))
newArray.push(array[i]);
}
Solution 3
We are required to write a JavaScript function that takes in one such array of objects. The function creates and return a new array in which no objects are repeated (by repeated we mean objects having same value for "Country" property.)
Moreover, the function should assign a count property to each object that represents the number of times they appeared in the original array.
const arr = [
{
"Country": "BR",
"New Lv1−Lv2": "#N/A"
},
{
"Country": "BR",
"New Lv1−Lv2": "#N/A"
},
{
"Country": "",
"New Lv1−Lv2": "test"
}];
const convert = (arr) => {
const res = {};
arr.forEach((obj) => {
const key = `${obj.Country}${obj["New Lv1−Lv2"]}`;
if (!res[key]) {
res[key] = { ...obj, count: 0 };
};
res[key].count += 1;
});
return Object.values(res);
};
console.log(convert(arr));
Ben
Updated on December 18, 2021Comments
-
Ben over 2 years
I have an array of objects as follows within my server side JS:
[ { "Company": "IBM" }, { "Person": "ACORD LOMA" }, { "Company": "IBM" }, { "Company": "MSFT" }, { "Place": "New York" } ]
I need to iterate through this structure, detect any duplicates and then create a count of a duplicate is found along side each value.
Both of the values must match to qualify as a duplicate e.g. "Company": "IBM" is not a match for "Company": "MSFT".
I have the options of changing the inbound array of objects if needed. I would like the output to be an object, but am really struggling to get this to work.
EDIT: Here is the code I have so far where processArray is the array as listed above.
var returnObj = {}; for(var x=0; x < processArray.length; x++){ //Check if we already have the array item as a key in the return obj returnObj[processArray[x]] = returnObj[processArray[x]] || processArray[x].toString(); // Setup the count field returnObj[processArray[x]].count = returnObj[processArray[x]].count || 1; // Increment the count returnObj[processArray[x]].count = returnObj[processArray[x]].count + 1; } console.log('====================' + JSON.stringify(returnObj));
-
Kem Bardly over 5 yearsHi can u explain this line (counter[key] || 0) + 1 I never seen this before.
-
ilumin over 5 yearsif the counter[key] aren't exist then use 0 instead
-
Alfrex92 over 4 yearswhat if I want to return an array of objects instead of an object?
-
Aqeel iqbal about 2 yearsGreat! Exactly what I was looking for. Thanks