@Adil1603

Как Найти совпадения значении массива и значении объекта, и вывести ключ найденного значения объекта?

Может неправильно написал вопрос, но задача такая:
Нужно вычислить преступника по уже известным данным.
Ваша задача состоит в том, чтобы создать функцию getKiller. getKiller принимает в себя
2 параметра:
1. suspectInfo. Это объект, в котором ключи - это подозреваемые в преступлении
люди, а значения - массивы людей, которых видели подозреваемые в день
убийства
2. deadPeople. Это массив с именами людей, которых убил преступник
Преступником является тот, кто видел всех убитых людей в день убийства. Функция
getKiller должна возвращать имя преступника.
Примеры результатов функции getKiller:

function getKiller(suspectInfo, deadPeople) {
    let killerName = '';
    Object.entries(suspectInfo).forEach((data) => {
        const suspectPerson = data[0];
        const peopleWereSeen = data[1];
        const isKiller = deadPeople.every((deadName) => peopleWereSeen.includes(deadName));
        if (isKiller) {
            killerName = suspectPerson;
        }
    })
    
    return killerName;
}

getKiller(
    {
    'James': ['Jacob', 'Bill', 'Lucas'],
    'Johnny': ['David', 'Kyle', 'Lucas'],
    'Peter': ['Lucy', 'Kyle'],
    },
    ['Lucas', 'Bill'])


Не могу полностью понять, как работает функция getKiller. Передаем в getKiller одним параметром объект, другим массив. Создаем пустую переменную, куда в конце запишется результат - имя преступника.

Далее при помощи Object.entries возвращаем 3 массива, где пара ключ-значение объекта это отдельный массив с 2-мя значениями.
А как дальше работает forEach? В (data) подставляются по очереди все вновь созданные 3 массива ?При каждой итерации создаются переменные suspectPerson и peopleWereSeen.

Далее создается константа isKiller, в котором мне не полностью понятная строка
deadPeople.every((deadName) => peopleWereSeen.includes(deadName))

Я так понимаю every берет значения из переданного в deadPeople массива и потом ищет в переменной peopleWereSeen это значение, возвращая тру или фолс.
Далее условие что если isKiller тру, то записывает в пустую переменную suspectPerson.

Тяжело все сформулировать, в общем я запутался в казалось бы не сложном коде. Помогите пожалуйста
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 1
TemaSM
@TemaSM
Fullstack, DevOps, InfSec
Результатом выполнения приведенной в пример функции в вопросе, будет строка 'James', так как James - единственный подозреваемый, который видел всех убитых людей в день убийства.

В функции getKiller мы используем метод Object.entries() для перебора объекта suspectInfo и получения доступа к ключам и значениям.
Затем мы проверяем, были ли все убитые люди видны каждому подозреваемому в день убийства с помощью метода every(). Если это так, то мы сохраняем имя этого подозреваемого в переменной killerName.
В конце мы возвращаем killerName.

Пример реализации функции

function getKiller(suspectInfo, deadPeople) {
  // Создаем объект для хранения информации о том, кого видели подозреваемые
  let seenBySuspects = {};
  
  // Заполняем объект seenBySuspects информацией о том, кого видели подозреваемые
  for (let suspect in suspectInfo) {
    for (let seenPerson of suspectInfo[suspect]) {
      if (!seenBySuspects[seenPerson]) {
        seenBySuspects[seenPerson] = [];
      }
      seenBySuspects[seenPerson].push(suspect);
    }
  }
  
  // Ищем преступника
  for (let suspect in suspectInfo) {
    let allDeadPeopleSeen = true;
    for (let deadPerson of deadPeople) {
      if (!seenBySuspects[deadPerson].includes(suspect)) {
        allDeadPeopleSeen = false;
        break;
      }
    }
    if (allDeadPeopleSeen) {
      return suspect;
    }
  }
  
  // Если преступник не найден, возвращаем null
  return null;
}

Сначала мы создаем объект seenBySuspects, который будет хранить информацию о том, кого видели подозреваемые.
Затем мы заполняем этот объект информацией на основе объекта suspectInfo.
Затем мы итерируемся по всем подозреваемым и проверяем, видели ли они всех убитых людей.
Если подозреваемый видел всех убитых людей, мы возвращаем его имя.
Если ни один подозреваемый не видел всех убитых людей, мы возвращаем null.

Если ответ помог, не забудьте отметить его как решение вашего вопроса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы