javascript - 为什么我们需要在函数中将映射的 bool 值缩减为单个值?

标签 javascript methods reduce

为什么我们需要在函数结束时reduce映射的 bool 值到单个值?

该函数的目的是使用 key value 对从另一个对象(第二个参数)过滤对象数组(第一个参数)。

它应该返回另一个 object 数组,其中第一个参数中的对象与第二个参数中的 keyvalue 匹配。

例如,如果第一个参数是 [{ 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/

相关文章:

javascript - 将对象键和值转换为对象数组

Python functools.reduce,如何减少列表并返回一个新列表

javascript - 在 Material-ui 和 Radium 中使用多种样式的问题

javascript - 如何在运行时突出显示 Protractor 中的元素

javascript - 用于从文件名中删除 Wordpress 图像大小调整的正则表达式或标准子字符串解决方案

javascript - UWP:如何调用WinAPI方法

javascript - 基于日期选择器设置和获取年龄

Java 方法重写 - 访问父类中的方法 - 这可能吗?

c# - 在WriteLine中使用static void方法输出

javascript - 为什么这个 array.reduce 函数根本没有减少?初学者