Tengo una matriz que contiene algunos objetos. Quiero encontrar nombres duplicados en la matriz. Después de encontrar los nombres duplicados de cada nombre duplicado, también debo verificar su antigüedad. Además de tener el mismo nombre, si la edad no es la misma pero los nombres son los mismos, guárdalo y dame error solo si el nombre es el mismo y la misma edad. Mi matriz tiene nombres duplicados que no tienen la misma edad Ahora el programa que escribí da un error y no debería dar un error porque los nombres son los mismos pero su edad no es la misma y debe guardarse y no hacerlo correctamente Después de buscar en la matriz , Encontré un nombre duplicado. Dos nombres de Liam duplicados tienen la misma edad. Da error en la consola, pero si la edad no es igual, no te equivoques y será Gracias por ayudarme a responder
const data = [ {id: 1,name: "Liam",age: 20}, {id: 2,name: "Liam",age: 18}, {id: 3,name: "Noah",age: 20}, {id: 4,name: "Noah",age: 18}, {id: 5,name: "Elijah",age: 18} ] function checked() { const toFindDuplicates = arry => arry.filter((item, index) => arry.indexOf(item) !== index); const getName = data.map(item => item.name) const duplicateName = toFindDuplicates(getName) console.log(duplicateName); if (duplicateName.length > 0) { const newArray = [] const filters = data.filter(x => duplicateName.includes(x.name)) filters.forEach(item => newArray.push(item.age)) console.log(filters); const duplicateAge = toFindDuplicates(newArray) if (!!duplicateName.length) { console.log("error"); } else { return console.log("save");; } } else { return console.log("save");; } } checked()Si entendí tu pregunta correctamente, simplemente quieres detectar si tus datos tienen el mismo par age name . Puedes comprobarlo así:
const data1 = [ {id: 1,name: "Liam",age: 20}, {id: 2,name: "Liam",age: 18}, {id: 3,name: "Noah",age: 20}, {id: 4,name: "Noah",age: 18}, {id: 5,name: "Elijah",age: 18} ] const data2 = [ {id: 1,name: "Liam",age: 20}, {id: 2,name: "Liam",age: 18}, {id: 3,name: "Noah",age: 20}, {id: 4,name: "Noah",age: 18}, {id: 5,name: "Elijah",age: 18}, {id: 6,name: "Liam",age: 18}, ] const duplicateExists = arr => { let error = false, obj = {} arr.forEach(el => { if(!error){ const {name,age} = el if(obj[name]) { error = obj[name] === age } obj[name] = age } } ,{}) return error } console.log(duplicateExists(data1)) console.log(duplicateExists(data2))Para una solución de paso único O(N) , podría considerar utilizar un Mapa que use el nombre como clave y un Conjunto de edades vistas anteriormente correspondientes al nombre como valor, ya que la búsqueda en un Conjunto es O(1) :
const data = [ {id: 1, name: "Liam", age: 20}, {id: 2, name: "Liam", age: 18}, {id: 3, name: "Noah", age: 20}, {id: 4, name: "Noah", age: 18}, {id: 5, name: "Elijah", age: 18}, ]; const hasDuplicates = arr => { const nameToAges = new Map(); for (const {_, name, age} of arr) { if (nameToAges.has(name)) { if (nameToAges.get(name).has(age)) { return true; } nameToAges.get(name).add(age); } else { nameToAges.set(name, new Set([age])); } } return false; } console.log("Two elements exist with same name and age:"); console.log(hasDuplicates(data));Pruébelo aquí .
[ Editar : Eliminada la solución compleja]
Si solo desea verificar si hay algún duplicado en la matriz, usar un Set simplifica mucho las cosas. Aquí hay una función más genérica para buscar duplicados en cualquier (combinación de) clave(s) en una matriz de Objetos.
const [data, data2] = getExampleData(); console.log(`hasDuplicatesForKeys(data, 'name', 'age'): ${ hasDuplicatesForKeys(data, 'name', 'age') }`); console.log(`hasDuplicatesForKeys(data2, 'name', 'age'): ${ hasDuplicatesForKeys(data2, 'name', 'age') }`); // name and id console.log(`hasDuplicatesForKeys(data2, 'name', 'id'): ${ hasDuplicatesForKeys(data2, 'name', 'id') }`); // single key console.log(`hasDuplicatesForKeys(data2, 'name'): ${ hasDuplicatesForKeys(data2, 'name') }`); console.log(`hasDuplicatesForKeys(data, 'id'): ${ hasDuplicatesForKeys(data, 'id') }`); /** * Generic function to check for duplicate Object * on certain keys within an array of objects * @param data {Array} The array * @param keys {string[]} The keys to filter on * @returns {boolean} */ function hasDuplicatesForKeys(data, ...keys) { let check = new Set(); data.forEach( d => check.add( keys.map( k => d[k] ).join(``) ) ); return [...check].length < data.length; } // keep data out of sight function getExampleData() { return [ [ {id: 1, name: "Liam", age: 20}, {id: 2, name: "Liam", age: 18}, {id: 3, name: "Noah", age: 20}, {id: 3, name: "Noah", age: 20}, {id: 4, name: "Noah", age: 18}, {id: 5, name: "Elijah", age: 18}, {id: 12, name: "Elijah", age: 18} ], [ {id: 1, name: "Liam", age: 20}, {id: 2, name: "Liam", age: 18}, {id: 3, name: "Noah", age: 20}, {id: 4, name: "Noah", age: 18}, {id: 5, name: "Elijah", age: 18} ], ]; }