为什么我们需要在函数结束时reduce
映射的 bool 值到单个值?
该函数的目的是使用 key
value
对从另一个对象(第二个参数)过滤对象数组(第一个参数)。
它应该返回另一个 object
数组,其中第一个参数中的对象与第二个参数中的 key
和 value
匹配。
例如,如果第一个参数是 [{ first: "Romeo", last: "Montague"}, { first: "Mercutio", last: null }, { first: "Tybalt", last: "凯普莱特”}]
第二个是{ last: "Capulet"}
函数应该返回 [{ first: "Tybalt", last: "Capulet"}]
这是我偶然发现的解决方案,无法理解 map(
) 和 reduce()
在这里的工作原理。
function whatIsInAName(collection, source) {
var srcKeys = Object.keys(source);
return collection.filter(function (obj) {
return srcKeys
.map(function(key) {
return obj.hasOwnProperty(key) && obj[key] === source[key];
})
.reduce(function(a, b) {
return a && b;
});
});
}
谢谢!
最佳答案
首先,该函数创建一个数组,其中包含它需要在 srcKeys
中查找的所有键,例如['最后']
。为了正确说明该算法,假设您正在寻找两个键,source = { last: 'Capulet', first: 'Jon' }
→ ['last', '第一']
。
然后它将该数组映射到 bool 数组,其中每个值表示 collection
中的项目是否具有该键以及它的值是否与 source
中的值相同.例如:
['last', 'first'] → [true, true] // or
['last', 'first'] → [false, false] // or
['last', 'first'] → [false, true] // ...
然后它将这个 bool 值数组缩减为单个 bool 结果,只有当数组中的所有项都为 true
时,该结果才会为 true
:
[true, true] → true
[false, false] → false
[false, true] → false
FWIW,您可以使用 Array.prototype.every
一步完成:
return collection.filter(obj => {
return srcKeys.every(key => obj.hasOwnProperty(key) && obj[key] === source[key]);
});
关于javascript - 为什么我们需要在函数中将映射的 bool 值缩减为单个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52604270/