Soy un novato de JS. Quiero realizar un seguimiento de la cantidad de objetos duplicados en una matriz, en otro objeto, así que decidí escribir una función. Por ejemplo: considere el siguiente objeto.
const fruits = [{name: 'orange'}, {name: 'orange'}, {name: 'apple'}, {name: 'banana'}];Quiero realizar un seguimiento de la cantidad de objetos duplicados en la matriz anterior, así que escribí la siguiente función.
function calcDuplicates(fruitObj) { const duplicates = {}; for (let i of fruitObj) { duplicates[`${i.name}`] !== "undefined" ? (duplicates[`${i.name}`] += 1) : (duplicates[`${i.name}`] = 1); } return duplicates; }La salida que obtengo es:
{orange: NaN, apple: NaN, banana: NaN}( Salida esperada ) La salida que quiero es:
{orange: 2, apple: 1, banana: 1}¿Cómo obtengo el resultado esperado? que error estoy haciendo
Su error está probando contra "undefined" (la palabra) en lugar de undefined (un valor indefinido):
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) );En lugar de la cadena "undefined" , use el valor primitivo undefined en la condición:
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))Es porque su condición debe probarse contra undefined , no una cadena que contenga '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) );Y así es como lo escribiría:
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) ); Más o menos lo mismo, usando reduce y un map de desestructuración:
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) );