Давайте начнем с этой функции, которая используется в решении.Это предикат, который берет один из ключей от объекта в source
и возвращает логическое значение:
function(key) {
return obj.hasOwnProperty(key) && obj[key] === source[key];
}
Немного сложнее то, что он также ссылается на obj
, что в контексте относится к одному изобъекты в collection
.Таким образом, вы можете думать об этом, на данном этапе объяснения, как функцию двух переменных:
function(obj, key) {
return obj.hasOwnProperty(key) && obj[key] === source[key];
}
Так когда же это правда?Это легко: когда obj
имеет key
в качестве одного из своих ключей и для которого значение равно значению source
для того же ключа.Другими словами, он проверяет, согласны ли obj
и source
в отношении ключа key
.
Так что же нам делать с этой функцией?Мы map
это над массивом srcKeys
- который содержит все ключи source
.Итак, помня, что это со ссылкой на фиксированный объект obj
, мы получаем массив логических значений, указывающих, найден ли каждый ключ source
с тем же значением в obj
.
Тогдаоперация reduce
, которая просто использует оператор &&
, просто проверяет, являются ли все значения в этом массиве логических значений истинными.Итак, мы видим, что этот раздел кода:
return srcKeys
.map(function(key) {
return obj.hasOwnProperty(key) && obj[key] === source[key];
})
.reduce(function(a, b) {
return a && b;
});
возвращает логическое значение, проверяющее, имеет ли obj
все ключи, указанные в source
, и соглашается со значениями.
Последнийшаг теперь является естественным - collection
является filter
ed этим предикатом, означая, что конечный результат - это массив, состоящий из тех элементов collection
, которые согласуются с source
во всех ключах source
.Это именно то, что было желаемое поведение:)