Сверить два массива с объектами

106
17 ноября 2020, 20:20

Есть два массива с объектами. Нужно сверить если элементы первого массива есть во втором. Пример:

const workers = [ 
  { 
    name: "John", 
    salary: 2500 
  }, 
  { 
    name: "Jason", 
    salary: 3000 
  } 
] 
 
const companies = [ 
  { 
    name: "BMW", 
    workers: [ 
      { 
         name: "John", 
         salary: 2000 
      }, 
      { 
        name: "Jason", 
        salary: 3000 
      } 
    ], 
    description: "some description" 
  }, 
  { 
    name: "ВАЗ", 
    workers: [ 
      { 
         name: "Вася", 
         salary: 200 
      }, 
      { 
        name: "Ваня", 
        salary: 3000 
      } 
    ], 
    description: "some description" 
}

Вывести компании у которых есть работники с этим именем и зарплатой меньше чем в массиве workers. У Джона зарплата 2500, а в компании 2000 - значит можно вывести объект из массива с компаниями. В данном случае вывести BMW.

Answer 1
companies.forEach(cmp =>                                            /*перебираем массив с компаниями*/                          
    cmp.workers && cmp.workers.forEach(cmpWk =>                     /*в компании перебираем массив с работниками этой компании*/
        workers.forEach(wk =>                                       /*в нём перебираем массив со всеми работниками*/            
            wk.name == cmpWk.name && wk.salary > cmpWk.salary &&    /*сравниваем работников по вашему условию*/                 
                console.log(wk.name, cmp)                           /*выводим компанию*/                                        
        )
    )
)
Answer 2
function checkSalary(workers, companies) {
    let workersObject = {};
    // Делаем из массива объектов workers просто объект с ключом name и значением salary
    workers.forEach((worker) => {
        if (worker.hasOwnProperty('name') && worker.hasOwnProperty('salary')) {
            // Это поможет в дальнейшем избежать лишних циклов для перебора значений
            workersObject[worker['name']] = worker['salary'];
        }
    });
    // теперь в workersObject хранятся такие значения:
    // { "John": 2500, "Jason": 3000 } - обращаться к такому объекту проще и быстрее по ключу, т.е. в данном случае по имени работника 
    // Будем перебирать все объекты в массиве компаний
    companies.forEach((company) => {
        if (company.hasOwnProperty('workers')) {
            // если объект "компания" имеет ключ workers, то перебираем всех работников этой компании
            company['workers'].forEach((worker) => {
                // теперь можно проверять условие основной задачи
                // если у объекта "работник" есть ключ "имя" и это имя содержится в ранее сформированном объекте "workersObject",
                if (worker.hasOwnProperty('name') && workersObject.hasOwnProperty(worker['name'])) {
                    // то далее проверяем, есть ли ключ "зарплата" у объекта "работник" и если, она меньше, чем у работника с таким же именем в объекте "workersObject",
                    if (worker.hasOwnProperty('salary') && worker['salary'] < workersObject[worker['name']]) {
                        // то выводим имя компании
                        console.log(company['name']);
                    }
                }
            });
        }
    });
}
READ ALSO
Не срабатывает третий цикл

Не срабатывает третий цикл

Нужно привести к такому виду:

123
Как передать значение select в php Mailer?

Как передать значение select в php Mailer?

Обратная связь на сайте реализована с помощью библиотеки php mailerВозникла необходимость передачи выбранного значения тега select

107
Изменение css через js onclick

Изменение css через js onclick

Здравствуйте, при таком использовании, действие происходит по правилам тоглера, те

123
Копирование блока

Копирование блока

как сделать что бы наведении на блок, на сайте предлагало копировать текст ?

151