I'm a JS newbie. I want to keep track of number of duplicate objects in an array, in another object, so I decided to write a function. For example: consider the below object.
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
I want to keep track of number of duplicate object in the above array, so I wrote the below function.
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== "undefined"
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
The output I'm getting is:
{orange: NaN, apple: NaN, banana: NaN}
(Expected output) The output which I want is:
{orange: 2, apple: 1, banana: 1}
How do I get the expected output? what mistake am I doing?
Your error is testing against "undefined" (the word) instead of undefined (an undefined value) :
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name] !== undefined
? (duplicates[i.name] += 1)
: (duplicates[i.name] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
Instead of string "undefined" use the primitive value undefined in the condition:
duplicates[`${i.name}`] !== undefined
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log(calcDuplicates(fruits))
It's because your condition should be tested against undefined, not a string containing 'undefined'.
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[`${i.name}`] !== undefined
? (duplicates[`${i.name}`] += 1)
: (duplicates[`${i.name}`] = 1);
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
And this is how I'd write it:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
function calcDuplicates(fruitObj) {
const duplicates = {};
for (let i of fruitObj) {
duplicates[i.name] = (duplicates[i.name] || 0) + 1
}
return duplicates;
}
console.log( calcDuplicates(fruits) );
Pretty much same thing, using reduce and a destructuring map:
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];
const calcDuplicates = o => o
.map(({ name }) => name)
.reduce((a, b) => ({ ...a, [b]: (a[b] || 0) + 1 }), {})
console.log( calcDuplicates(fruits) );