Мы пишем функцию, которая возвращает все объекты в массиве, содержащем все пары имя/значение из исходного объекта.
Мы напишем функцию 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 на простом английском — спасибо и продолжайте учиться!