为什么我们需要在函数中将映射的布尔值减少为单个值?

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)

谢谢!

dec*_*eze 6

首先,该函数创建一个包含需要在 中查找的所有键的数组srcKeys,例如[\'last\']。为了正确说明该算法,我们假设您正在寻找两个键source = { last: \'Capulet\', first: \'Jon\' }\xe2\x86\x92 [\'last\', \'first\']

\n\n

然后,它将该数组映射到布尔数组,其中每个值表示 中的项是否collection具有该键以及其值是否与 中的值相同source。例如:

\n\n
[\'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]   // ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,它将这个布尔数组减少为单个布尔结果,只有true当数组中的所有项目都是true

\n\n
[true, true]   \xe2\x86\x92 true\n[false, false] \xe2\x86\x92 false\n[false, true]  \xe2\x86\x92 false\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

FWIW,您可以使用以下方法一步完成此操作Array.prototype.every

\n\n
return collection.filter(obj => {\n  return srcKeys.every(key => obj.hasOwnProperty(key) && obj[key] === source[key]);\n});\n
Run Code Online (Sandbox Code Playgroud)\n