Je suis nouveau dans Arrays et je veux passer et obtenir de la valeur de mon premier tableau.

Le code ressemble à ceci:

Mon premier tableau est:

const CompanyData = [
    {id: 1, name: 'Company1', phone: 'X', address: 'Y' , person: [1, 2]},
    {id: 2, name: 'Company2', phone: 'X', address: 'Y'},
    {id: 3, name: 'Company3', phone: 'X', address: 'Y'}
  ];

Mon deuxième tableau est:

const PersonData = [
{id: 1, name: 'A', phone: 'D', address: 'X'},
{id: 2, name: 'B', phone: 'D', address: 'X'},
{id: 3, name: 'C', phone: 'D', address: 'X'}
];

Comment puis-je transmettre et obtenir la valeur de PersonData dans CompanyData sur le tableau person ?

Si cela est possible, faites le moi savoir. Merci.

-2
Catalin Balan 27 août 2020 à 20:11

5 réponses

Meilleure réponse

Que diriez-vous plutôt de Map?

À mon avis, les tableaux ne sont pas une bonne option de structure de données pour ce que vous essayez de réaliser. Puisqu'il n'a pas de clés, vous devrez parcourir tous les tableaux jusqu'à ce que vous trouviez ce que vous recherchez. Ce qui est bien pour cette quantité de données, mais peut devenir très lent lorsque les choses commencent à évoluer.

Vous pouvez utiliser Map à la place. Qui utilise une clé pour identifier la valeur.

// Crete a Map Object
const PersonMap = new Map();

// Convert your Array to Map Format
PersonData.forEach(function(person) {
  PersonMap.set(person.id, person);
});

// Get a person by Id
console.log(PersonMap.get(1)); // Outputs {id: 1, name: 'A', phone: 'D', address: 'X'}

Donc avec cela, dans CompanyData [0] .person (ou tout autre, bien sûr), vous pouvez ensuite pousser PersonMap.get (1) et PersonMap.get (2).

// Make it an empty array
CompanyData[0].person = [];

// Push a single entry for each person
CompanyData[0].person.push(PersonMap.get(1));
CompanyData[0].person.push(PersonMap.get(2));

// This will give the intended result

Ou vous pouvez tout pousser par lots.

// Push all, automatically
CompanyData.forEach(function(company) {
  if(company.person) { // Since some companies doesn't have any person
    company.person = company.person.map(function(person) {
      return PersonMap.get(person);
    });
  }
});

Et si je voulais utiliser Maps depuis le début?

Vous devrez déclarer la clé. Map.size est comme la propriété length du tableau, renvoyant le montant des entrées os à l'intérieur. Vous pouvez donc créer la carte comme ceci:

const PersonData = new Map();

PersonData.set(PersonData.size + 1, {
  id: PersonData.size + 1,
  name: 'A',
  phone: 'D',
  address: 'X'
});

Pour plus d'informations sur Maps, ici.


Nan? Seuls les tableaux? D'accord

Quoi qu'il en soit, si vous voulez toujours utiliser un tableau, je vais devoir vérifier si l'id est égal à chaque itération, jusqu'à ce que vous trouviez ce que vous cherchez, ce qui donne quelque chose comme ceci:

// For + If Solution
CompanyData.forEach(function(company) { // For every company
  if(company.person) { // If company has persons
    company.person = company.person.map(function(member) { // For every person in company (member)
      for(let person of PersonData) { // Looks for every person
        if(member === person.id) return person; // If is the person
      }
    });
  }
});
// Filter Solution
CompanyData.forEach(function(company) { // For every company
  if(company.person) { // If company has persons
    company.person = company.person.map(function(member) { // For every person in company (member)
      return PersonData.filter(function(person) { return person.id === member });
    });
  }
});
-1
Gabriel Andrade 27 août 2020 à 19:10

Essaye ça.

const CompanyData = [
    {id: 1, name: 'Company1', phone: 'X', address: 'Y' , person: [1,2]},
    {id: 2, name: 'Company2', phone: 'X', address: 'Y'},
    {id: 3, name: 'Company3', phone: 'X', address: 'Y'}
  ]
const PersonData = [
{id: 1, name: 'A', phone: 'D', address: 'X'},
{id: 2, name: 'B', phone: 'D', address: 'X'},
{id: 3, name: 'C', phone: 'D', address: 'X'}
];

CompanyData.forEach(comp => {
  if (comp.person) {
    comp.person = comp.person.map(personId => PersonData.find(person => person.id === personId));
  }
});

console.log(CompanyData);
0
Vivek Jain 27 août 2020 à 17:28

Si vous voulez obtenir les données d'une personne selon l'id, le mieux sera de créer une fonction et à partir de là, de renvoyer l'élément de PersonData

const PersonData = [
    {id: 1, name: 'A', phone: 'D', address: 'X'},
    {id: 2, name: 'B', phone: 'D', address: 'X'},
    {id: 3, name: 'C', phone: 'D', address: 'X'}
]


const getPerson=(...args)=>{
    console.log(args)
    const Person=[];
    args.forEach(x=>{
        Person.push(PersonData.filter(y=>y.id===x))
    })
    return Person;
}
const CompanyData = [
{id: 1, name: 'Company1', phone: 'X', address: 'Y' , person: getPerson(1,2)},
{id: 2, name: 'Company2', phone: 'X', address: 'Y'},
{id: 3, name: 'Company3', phone: 'X', address: 'Y'}
]

Vous obtiendrez un tableau dans CompanyData [0] .person

Vous pouvez modifier la fonction getPerson comme vous le souhaitez et c'est juste l'idée de la façon dont vous pouvez la rendre compatible avec plusieurs valeurs et renvoyer n'importe quoi.

0
Vivek Singh 27 août 2020 à 17:27

Cherchez-vous quelque chose comme ça?

Selon la description mentionnée.

const CompanyData = [
    {id: 1, name: 'Company1', phone: 'X', address: 'Y' ,person: [1,2]},
    {id: 2, name: 'Company2', phone: 'X', address: 'Y'},
    {id: 3, name: 'Company3', phone: 'X', address: 'Y'}
  ]
  
  const PersonData = [
{id: 1, name: 'A', phone: 'D', address: 'X'},
{id: 2, name: 'B', phone: 'D', address: 'X'},
{id: 3, name: 'C', phone: 'D', address: 'X'}
]

CompanyData[0].person = [...PersonData];
console.log(CompanyData);
0
Vahid Akhtar 27 août 2020 à 17:22

J'ai écrit deux scripts pour cela. dans le premier, je montre seulement comment ajouter des données de personne dans le premier objet du tableau "companyData". mais dans le second avec un "for-in-loop", j'ai ajouté les données pour chaque personne à chaque objet du tableau "companyData". J'ai également changé le nom des propriétés dans le tableau "personData" pour une compréhension claire.

//script1 
let personData = [
    {idPer: 1, namePer: 'Company1', phonePer: 'X', addressPer: 'Y'},
    {idPer: 2, namePer: 'Company2', phonePer: 'X', addressPer: 'Y'},
    {idPer: 3, namePer: 'Company3', phonePer: 'X', addressPer: 'Y'}
  ];

let person = personData[1].namePer;

let companyData = [
    {id: 1, name: 'Company1', phone: 'X', address: 'Y' , personDataInp: person},
    {id: 2, name: 'Company2', phone: 'X', address: 'Y'},
    {id: 3, name: 'Company3', phone: 'X', address: 'Y'}
  ];
  
  console.log(companyData);
  
  //script2
  
let personData2 = [
    {idPer: 1, namePer: 'Company1', phonePer: 'X', addressPer: 'Y'},
    {idPer: 2, namePer: 'Company2', phonePer: 'X', addressPer: 'Y'},
    {idPer: 3, namePer: 'Company3', phonePer: 'X', addressPer: 'Y'}
  ];


let companyData2 = [
    {id: 1, name: 'Company1', phone: 'X', address: 'Y'},
    {id: 2, name: 'Company2', phone: 'X', address: 'Y'},
    {id: 3, name: 'Company3', phone: 'X', address: 'Y'}
  ];

for(i in companyData2) {
    companyData2[i].personDataInp = personData2[i].namePer;
}

console.log(companyData2);
0
hamid-davodi 27 août 2020 à 18:03