Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我们需要将映射的布尔值减少到函数中的单个值?_Javascript_Methods_Reduce - Fatal编程技术网

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

Javascript 为什么我们需要将映射的布尔值减少到函数中的单个值?,javascript,methods,reduce,Javascript,Methods,Reduce,为什么我们需要在函数末尾将映射的布尔值减少为单个值 该函数的目的是从另一个对象的第二个参数中筛选具有键值对的对象第一个参数数组 它应该返回另一个对象数组,其中包含来自第一个参数的对象,这些对象与来自第二个参数的键和值都匹配 例如,如果第一个参数是[{first:Romeo,last:Montague},{first:Mercutio,last:null},{first:Tybalt,last:Capulet}] 第二个是{last:Capulet} 函数应返回[{first:Tybalt,las

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

该函数的目的是从另一个对象的第二个参数中筛选具有键值对的对象第一个参数数组

它应该返回另一个对象数组,其中包含来自第一个参数的对象,这些对象与来自第二个参数的键和值都匹配

例如,如果第一个参数是[{first:Romeo,last:Montague},{first:Mercutio,last:null},{first:Tybalt,last:Capulet}]

第二个是{last:Capulet}

函数应返回[{first:Tybalt,last:Capulet}]

这就是我偶然发现的解决方案,我无法理解映射和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中查找的所有键,例如。['last']。为了正确地说明这个算法,让我们假设您正在寻找两个键,source={last:'Capulet',first:'Jon'}→ [‘最后’、‘第一’]

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

然后,它将此布尔值数组减少为单个布尔值结果,只有当数组中的所有项都为真时,该结果才会为真:

FWIW,您可以使用以下方法一步完成:


首先,该函数创建一个数组,其中包含它需要在srcKeys中查找的所有键,例如。['last']。为了正确地说明这个算法,让我们假设您正在寻找两个键,source={last:'Capulet',first:'Jon'}→ [‘最后’、‘第一’]

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

然后,它将此布尔值数组减少为单个布尔值结果,只有当数组中的所有项都为真时,该结果才会为真:

FWIW,您可以使用以下方法一步完成:


让我们从解决方案中使用的函数开始。它是一个谓词,从源中的对象获取一个键并返回布尔值:

function(key) {
    return obj.hasOwnProperty(key) && obj[key] === source[key];
}
有点棘手的是,它还引用了obj,在上下文中它引用了集合中的一个对象。所以你可以在解释的这一点上,把它看作是两个变量的函数:

function(obj, key) {
    return obj.hasOwnProperty(key) && obj[key] === source[key];
}
那么什么时候是真的?这很简单:当obj的键之一是key,并且其值等于同一个键上的source值时。换句话说,它检查obj和source在键方面是否一致

那么我们用这个函数做什么呢?我们将它映射到数组srcKeys上,该数组保存源代码的所有键。所以,记住这是关于一个固定对象obj的,我们得到一个布尔数组,指示源的每个键是否在obj中找到,值是否相同

然后reduce操作只使用&&操作符,它只检查布尔数组中的所有值是否为真。我们看到这段代码:

return srcKeys
  .map(function(key) {
    return obj.hasOwnProperty(key) && obj[key] === source[key];
  })
  .reduce(function(a, b) {
    return a && b;
  });
返回一个布尔值,检查obj是否具有源中指定的所有键,并在值处一致


最后一步是自然-集合由该谓词过滤,这意味着最终结果是一个数组,由集合中的元素组成,这些元素在源的所有键中都与源一致。这正是所需的行为:

让我们从解决方案中使用的函数开始。它是一个谓词,从源中的对象获取一个键并返回布尔值:

function(key) {
    return obj.hasOwnProperty(key) && obj[key] === source[key];
}
有点棘手的是,它还引用了obj,在上下文中它引用了集合中的一个对象。所以你可以在解释的这一点上,把它看作是两个变量的函数:

function(obj, key) {
    return obj.hasOwnProperty(key) && obj[key] === source[key];
}
那么什么时候是真的?这很简单:当obj的键之一是key,并且其值等于同一个键上的source值时。换句话说,它检查obj和source在键方面是否一致

那么我们用这个函数做什么呢?我们将它映射到数组srcKeys上,该数组保存源代码的所有键。所以,记住这是关于一个固定对象obj的,我们得到一个布尔数组,指示源的每个键是否在obj中找到,值是否相同

然后reduce操作只使用&&操作符,它只检查布尔数组中的所有值是否为真。我们看到这段代码:

return srcKeys
  .map(function(key) {
    return obj.hasOwnProperty(key) && obj[key] === source[key];
  })
  .reduce(function(a, b) {
    return a && b;
  });
返回一个布尔值,检查obj是否具有源中指定的所有键,并在值处一致

最后一步是自然-集合由该谓词过滤,这意味着最终结果是一个数组,由集合中的元素组成,这些元素在源的所有键中都与源一致。这正是我们想要的b ehaviour was:

源对象可能有多个键。简化为一个布尔值是为了证明过滤对象包含并匹配源对象的所有属性。源对象可能有多个键。简化为一个布尔值是为了证明过滤对象包含并匹配源对象的所有属性。