Pet*_*ach 3 javascript methods reduce
为什么我们需要reduce在函数末尾将布尔值映射为单个值?
该函数的目的是使用另一个对象(第二个参数)中的对来过滤对象数组key value(第一个参数)。
它应该返回另一个数组,object其中第一个参数中的对象与第二个参数中的key和都匹配value。
例如,如果第一个参数是[{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }]
第二个是{ 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;
});
});
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
首先,该函数创建一个包含需要在 中查找的所有键的数组srcKeys,例如[\'last\']。为了正确说明该算法,我们假设您正在寻找两个键source = { last: \'Capulet\', first: \'Jon\' }\xe2\x86\x92 [\'last\', \'first\']。
然后,它将该数组映射到布尔数组,其中每个值表示 中的项是否collection具有该键以及其值是否与 中的值相同source。例如:
[\'last\', \'first\'] \xe2\x86\x92 [true, true] // or\n[\'last\', \'first\'] \xe2\x86\x92 [false, false] // or\n[\'last\', \'first\'] \xe2\x86\x92 [false, true] // ...\nRun Code Online (Sandbox Code Playgroud)\n\n然后,它将这个布尔数组减少为单个布尔结果,只有true当数组中的所有项目都是true:
[true, true] \xe2\x86\x92 true\n[false, false] \xe2\x86\x92 false\n[false, true] \xe2\x86\x92 false\nRun Code Online (Sandbox Code Playgroud)\n\nFWIW,您可以使用以下方法一步完成此操作Array.prototype.every:
return collection.filter(obj => {\n return srcKeys.every(key => obj.hasOwnProperty(key) && obj[key] === source[key]);\n});\nRun Code Online (Sandbox Code Playgroud)\n