Eu tenho uma matriz com endereços de alunos e pais.
Por exemplo,
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'
}
];
Estou tentando reformatar isso para o seguinte 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'
}
]
}
];
Até agora tentei da seguinte maneira. Não tenho certeza se esse é o caminho certo ou não.
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
fonte
fonte
parent_address
erelationship
em umparent
objeto, e fundi-los quando um nome duplicado e endereço de e-mail são encontrados.const list = []
a princípio, mas na parte inferior você itera sobre essa lista aparentemente ao iteraruser[0]
. Seu código de exemplo deve ser consistente.Respostas:
Uma abordagem seria usar
.reduce()
um objeto como acumulador. Para cada identificação, você pode armazenar um objeto associado a uma matriz pai, à qual você pode anexar no.reduce()
retorno de chamada sempre que encontrar um novo objeto com a mesma identificação. Então, para obter uma variedade de objetos do seu objeto, você pode chamáObject.values()
-loVeja o exemplo abaixo:
Como você mencionou que é iniciante no JS, pode ser mais fácil entender de uma maneira mais imperativa (consulte os comentários do código para obter detalhes):
fonte
reduce
retorno de chamada é boa, mas talvez um pouco pesada para iniciantes.Você pode reduzir a matriz e procurar um usuário com o mesmo ID e adicionar as informações principais a ela.
Se o usuário não for encontrado, adicione um novo usuário ao conjunto de resultados.
fonte
A reestruturação de dados como esse é bastante comum e
Array.reduce()
foi projetada para a tarefa. É uma maneira diferente de visualizar as coisas e leva algum tempo para se acostumar, mas depois que você escreve o código algumas vezes, ele se torna uma segunda natureza.reduce()
é chamado em uma matriz e usa dois parâmetros:Sua função é chamada para cada elemento com o valor inicial para a primeira execução ou o valor de retorno da chamada de função anterior para cada execução subsequente, ao longo do elemento da matriz, indexa na matriz original e a matriz original que reduz () foi chamado (os dois últimos geralmente são ignorados e raramente são necessários). Ele deve retornar o objeto ou o que você está construindo com o elemento atual adicionado e esse valor de retorno é passado para a próxima chamada da sua função.
Para coisas como essa, geralmente tenho um objeto para manter as chaves exclusivas (
id
para você), mas vejo que você deseja que uma matriz seja retornada. Essa é uma linha para mapear o objeto e as chaves para uma matriz e é mais eficiente usar o mecanismo de propriedade do objeto incorporado em vez de array.find () para verificar se você já adicionou um ID.fonte
Você precisa iterar duas vezes usando o método atual. A complexidade é O (n ^ 2). (para Loop + indexOf)
Uma maneira melhor é indexar a matriz e usar a chave da matriz para detecção e pesquisa de duplicação.
Por exemplo:
fonte
fonte
Você pode usar a
Map
coleção para armazenar itens exclusivos e preenchê-la usandofilter
:fonte
fonte