Tengo una matriz con direcciones de estudiantes y padres.
Por ejemplo,
const users = [{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent_address: 'USA',
relationship:'mother'
},
{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent_address: 'Spain',
relationship:'father'
},
{
id: 2,
name: 'Mark',
email: '[email protected]',
age: 28,
parent_address: 'France',
relationship:'father'
}
];
Estoy tratando de formatear esto para el siguiente resultado.
const list = [
{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent: [
{
parent_address: 'USA',
relationship:'mother'
},{
parent_address: 'Spain',
relationship:'father'
}
]
},
{
id: 2,
name: 'Mark',
email: '[email protected]',
age: 28,
parent:[
{
parent_address: 'France',
relationship:'father'
}
]
}
];
Hasta ahora intenté de la siguiente manera. No estoy seguro de que sea la forma correcta o no.
const duplicateInfo = [];
for (var i = 0; i < user[0].length; i++) {
var parent = [];
if (duplicateInfo.indexOf(user[0][i].id) != -1) {
// Do duplicate stuff
} else {
// Do other
}
duplicateInfo.push(user[0][i].id);
}
javascript
arrays
kathy
fuente
fuente
parent_address
y formarrelationship
unparent
objeto, y fusionarlos cuando se encuentra un nombre duplicado y una dirección de correo electrónico.const list = []
Al principio dices , pero al final iteras sobre esa lista aparentemente iterando sobre ellauser[0]
. Su código de ejemplo debe ser coherente.Respuestas:
Un enfoque sería utilizarlo
.reduce()
con un objeto como acumulador. Para cada ID, puede almacenar un objeto asociado con una matriz de padres que puede agregar en su.reduce()
devolución de llamada cada vez que encuentre un nuevo objeto con el mismo ID. A continuación, para obtener una matriz de objetos de su objeto, puede llamarObject.values()
en élVer ejemplo a continuación:
Como mencionó que es nuevo en JS, puede ser más fácil de entender de una manera más imperativa (vea los comentarios del código para más detalles):
fuente
reduce
devolución de llamada es agradable, pero quizás un poco pesado para un principiante.Podría reducir la matriz y buscar un usuario con la misma identificación y agregarle la información principal.
Si no se encuentra el usuario, agregue un nuevo usuario al conjunto de resultados.
fuente
Reestructurar datos como este es bastante común y
Array.reduce()
está diseñado para la tarea. Es una forma diferente de ver las cosas y lleva un tiempo acostumbrarse, pero después de escribir el código varias veces se convierte en una segunda naturaleza.reduce()
se llama en una matriz y toma dos parámetros:Entonces se llama a su función para cada elemento con el valor inicial para la primera ejecución o el valor de retorno de la llamada a la función anterior para cada ejecución posterior, a lo largo del elemento de matriz, indexe en la matriz original y la matriz original que reduce () fue llamado (los dos últimos generalmente se ignoran y rara vez se necesitan). Debería devolver el objeto o lo que sea que esté construyendo con el elemento actual agregado, y ese valor de retorno se pasa a la siguiente llamada a su función.
Para cosas como esta, generalmente tengo un objeto para mantener las claves únicas (
id
para usted), pero veo que desea que se devuelva una matriz. Esa es una línea para asignar el objeto y las claves a una matriz y es más eficiente usar el mecanismo de propiedad de objeto incorporado en lugar de array.find () para ver si ya ha agregado una identificación.fuente
Necesita iterar dos veces utilizando el método actual. La complejidad es O (n ^ 2). (para Loop + indexOf)
Una mejor manera es indexar la matriz y usar la clave de matriz para la detección y búsqueda de duplicación.
Por ejemplo:
fuente
fuente
Puede usar la
Map
colección para almacenar artículos únicos y rellenarlos usandofilter
:fuente
fuente