Мы пишем функцию, которая возвращает все объекты в массиве, содержащем все пары имя/значение из исходного объекта.

Мы напишем функцию whatIsInAName, которая принимает массив (collection) и объект (source).

Вам дан массив объектов. Цель функции — просмотреть массив объектов collection и вернуть массив всех объектов, имеющих совпадающие пары имени и значения, в качестве объекта source.

Каждая пара имени и значения объекта source должна присутствовать в объекте из collection.

Пример:

let collection = [
{ "apple": 1, "bat": 2 }, 
{ "bat": 2 }, 
{ "apple": 1, "bat": 2, "cookie": 2 }
];
let source = { "apple": 1, "bat": 2 };

Если мы посмотрим на наш пример, то единственными объектами, которые содержат все пары имен и значений из source, являются первый и третий объекты. Функция поместит эти два объекта в массив и вернет:

[{ “apple”: 1, “bat”: 2 }, { “apple”: 1, “bat”: 2, “cookie”: 2 }]

Напишем функцию.

Во-первых, мы создаем три переменные:

let arr = [];
let hasAllEntries = 0;
const sourceObject = Object.entries(source);

Переменная arr — это переменная, которая будет содержать все объекты из массива collection, в котором есть все совпадающие пары имя-значение, такие как source.

Для следующей переменной мне пришлось нелегко, пытаясь найти способы убедиться, что каждый объект из collection имеет каждую совпадающую пару имя-значение из объекта source. hasAllEntries будет следить за этим.

Переменная sourceObject использует объект Object для преобразования объекта в массив. Это позволяет легко итерировать.

Object.entries создает массив массивов. Каждый подмассив состоит из двух элементов. Первое — свойство, второе — значение. Эта переменная создает массив из аргумента объекта source.

Далее мы проходим по массиву collection. Затем мы добавляем дополнительный вложенный цикл for для перебора массива sourceObject.

Для каждого объекта, который мы просматриваем в массиве collection, мы также прокручиваем каждую пару ключ-значение в массиве sourceObject.

При переборе sourceObject, поскольку мы имеем дело с двумерным массивом, мы деструктурируем массив на его ключ (sourceKey) и значение (sourceValue).

В нашем условном выражении, если объект внутри массива collection содержит свойство, соответствующее sourceKey, и если это свойство объекта имеет значение, соответствующее sourceValue, мы увеличиваем hasAllEntries.

Если вы читали ранее, подсчет переменной hasAllEntries для каждого совпадения пары имя-значение, которое мы получаем от каждого объекта в collection, был единственным способом отследить и увидеть, есть ли у этого объекта все пары имя-значение из объекта source.

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

Чтобы вернуться к функции, мы пишем условное выражение. В зависимости от длины sourceObject, если hasAllEntries равно длине массива sourceObject, это означает, что конкретный объект из collection имеет каждую пару имя-значение из source. Если это так, мы помещаем этот объект в массив arr.

Прежде чем перейти к следующему объекту, мы сбрасываем hasAllEntries обратно в 0.

if (hasAllEntries === sourceObject.length) {
    arr.push(object);
}
hasAllEntries = 0;

После выполнения циклов мы возвращаем массив arr.

return arr;

На этом наш код заканчивается. Это не идеально, но вот остальная часть функции:

Если вы нашли этот алгоритм полезным, ознакомьтесь с другими моими решениями по алгоритму JavaScript:







hasAllEntries = 0;
}

Примечание от JavaScript на простом английском:

Мы запустили три новых издания! Проявите любовь к нашим новым публикациям, подписавшись на них: AI на простом английском, UX на простом английском, Python на простом английском — спасибо и продолжайте учиться!