Как передать значение массива внутри массива объектов?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я новичок в массивах, и я хочу передать и получить значение из моего первого массива.

Код выглядит следующим образом:

Мой первый массив — это:

 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'}
];
  

Как я могу передать и получить значение из PersonData внутри CompanyData в массиве person?

Если это возможно, дайте мне знать. Спасибо.

Комментарии:

1. Каков ожидаемый результат? Также, пожалуйста, не забудьте добавить, что вы пытались достичь этого

2. вы пытаетесь создать новый массив таким образом, чтобы идентификаторы каждого массива были объединены?

Ответ №1:

Вы смотрите что-то вроде этого?

согласно упомянутому описанию.

 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);  

Комментарии:

1. Обратите внимание, что это будет неглубокая копия. А именно, если вы измените объект внутри поля person, вы также измените PersonData

Ответ №2:

Если вы хотите получить данные пользователя в соответствии с идентификатором, то лучше будет создать функцию и оттуда вернуть элемент 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'}
]
  

Вы получите массив внутри CompanyData[0].person

Вы можете редактировать функцию getPerson по своему усмотрению, и это просто идея о том, как вы можете сделать ее совместимой с несколькими значениями и возвращать что угодно.

Ответ №3:

Попробуйте это.

 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);  

Комментарии:

1. Не используйте комментарий для такого, пожалуйста, кстати, я не копирую?

2. @RadicalEdward Я не говорю, что вы скопировали. Я просто предлагаю не дублировать ответ. Перед публикацией ответа, пожалуйста, посмотрите, доступен тот же ответ или нет.

3. Разница в 3 минуты, я не узнал ваш, когда начал. извините, если вы не это имели в виду.

4. Действительно одобрено. ваш код лучше моего. но иногда просто решение не имеет значения, но объяснение тоже. но не в этом случае.

5. Будет удален в первый раз по вашему предложению

Ответ №4:

Для этого я написал два сценария. в первом я только показываю, как добавить данные о персонале в первый объект массива «companyData». но во втором с помощью «for-in-loop» я добавил данные для каждого человека в каждый объект массива «companyData». Я также изменил название свойств в массиве «PersonData» для ясного понимания.

 //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);  

Ответ №5:

Как насчет Map вместо этого?

На мой взгляд, массивы не являются хорошим вариантом структуры данных для того, чего вы пытаетесь достичь. Поскольку у него нет ключей, вам придется перебирать все массивы, пока вы не найдете то, что ищете. Это нормально для такого объема данных, но может стать очень медленным, когда все начинает масштабироваться.

Вместо этого вы могли бы использовать Map . Который использует ключ для идентификации значения.

 // 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'}

  

Таким образом, в CompanyData[0].person (или любом другом, конечно) вы можете нажать PersonMap.get(1) и 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
  

Или вы могли бы отправить все это в пакетном режиме.

 // 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);
    });
  }
});
  

Что, если бы я хотел использовать карты с самого начала?

Вам нужно будет объявить ключ. Map.size похож на свойство length массива, возвращающее количество записей os внутри. Итак, вы могли бы построить карту следующим образом:

 const PersonData = new Map();

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

Больше карт, здесь.


Нет? Только массивы? ОК

В любом случае, если вы хотите по-прежнему использовать массив, мне придется проверять, равен ли идентификатор на каждой итерации, пока вы не найдете то, что ищете, в результате чего получится что-то вроде этого:

 // 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 });
    });
  }
});