当前位置: 首页 > 知识库问答 >
问题:

在javascript中使用map和reduce过滤数组中的对象

毛淳
2023-03-14

freecodecamp有一个问题,细节如下:

要求:
创建一个函数,该函数查看对象数组(第一个参数),并返回具有匹配名称和值对的所有对象数组(第二个参数)。

例如,如果第一个参数是[{first:“Romeo”,last:“Montague”},{first:“Mercutio”,last:null},{first:“Tybalt”,last:“Capulet”}],并且第二个参数是{last:“Capulet”},那么您必须返回数组中的第三个对象(第一个参数),因为它包含作为第二个参数传递的名称及其值。

预期成果:

whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }) should return [{ first: "Tybalt", last: "Capulet" }].

whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 }) should return [{ "apple": 1, "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }].

whatIsInAName([{ "apple": 1, "bat": 2 }, { "apple": 1 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "cookie": 2 }) should return [{ "apple": 1, "bat": 2, "cookie": 2 }].

whatIsInAName([{ "apple": 1, "bat": 2 }, { "apple": 1 }, { "apple": 1, "bat": 2, "cookie": 2 }, { "bat":2 }], { "apple": 1, "bat": 2 }) should return [{ "apple": 1, "bat": 2 }, { "apple": 1, "bat": 2, "cookie":2 }].

根据网站,有一个这样的解决方案:

function whatIsInAName(collection, source) {
  var srcKeys = Object.keys(source);

  // filter the collection
  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;
      });
  });
}

// test here
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });

在这个解决方案中,有一点我不太理解,那就是来自map函数的返回值。

在此之前,在我的预期中,map函数将遍历所有键和值对以检查是否匹配,并返回具有布尔值的数组,例如[{true,false},{false,false}]等,并将布尔值传递给reduce函数。

var source = { last: "Capulet" };
var collection = [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }];
var srcKeys = Object.keys({ last: "Capulet" });

collection.filter(function(obj){
  return srcKeys.map(function(key){
    return obj.hasOwnProperty(key) && obj[key] === source[key];
  })
})
(3) [{…}, {…}, {…}]
 0: {first: "Romeo", last: "Montague"}
 1: {first: "Mercutio", last: null}
 2: {first: "Tybalt", last: "Capulet"}
 length: 3
  __proto__: Array(0)

在这种情况下,我有两个问题:

>

  • 在map函数中,它使用对调用数组中的每个元素调用提供的函数的结果创建一个新数组。在这种情况下,既然我们只想返回符合条件的元素,为什么它不返回布尔值或者只返回具有匹配值的元素,而是返回所有的值呢?或者我对映射函数有什么理解错误的地方?

    在reduce函数中,在map函数之后,它如何将映射的布尔值获取到一个布尔值,以指示是否所有srcKeys都通过了上面检查的条件?例如,在本例中,reduce函数是否只是取map的返回值并进一步计算?

    非常感谢您的帮助!

  • 共有1个答案

    仇征
    2023-03-14

    正如我所说,函数map并不是必需的。

    您可以使用函数filter和函数every来筛选那些与键值对对象(第二个参数)匹配的对象。

    let whatIsInAName = (arr, obj) => arr.filter(o => Object.keys(obj).every(k => obj[k] === o[k]));
    
    console.log(whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 }));
    console.log(whatIsInAName([{ "first": "Romeo", "last": "Montague" }, { "first": "Mercutio", "last": null }, { "first": "Tybalt", "last": "Capulet" }], { "last": "Capulet" }));
    console.log(whatIsInAName([{ "apple": 1, "bat": 2 }, { "apple": 1 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "cookie": 2 }));
    console.log(whatIsInAName([{ "apple": 1, "bat": 2 }, { "apple": 1 }, { "apple": 1, "bat": 2, "cookie": 2 }, { "bat":2 }], { "apple": 1, "bat": 2 }));
    .as-console-wrapper { max-height: 100% !important; top: 0; }
     类似资料:
    • 我正在处理一个freecodecamp挑战,我想知道为什么我的代码不工作,以及如何纠正它。 目标是“返回一个数组,该数组由每个提供的子数组中的最大数组成。” 我的尝试是使用减少作为映射函数映射输入数组: 当前输出为: 我应该如何修复我的代码?

    • 如何过滤<代码>地图 仅当列表中的任何员工具有字段值性别=“M”时,我才必须过滤。 输入:

    • ,和在Python 2中完美工作。这里有一个例子: 但是在Python 3中,我收到以下输出: 如果有人能向我解释这是为什么,我将不胜感激。 为进一步清晰起见,代码截图:

    • 问题内容: 我有一系列对象,我想知道搜索它的最佳方法。给定以下示例,我如何搜索和?jQuery有什么可以帮助的吗?还是我必须自己蛮力搜​​索? 问题答案: 您可以使用:

    • 本文向大家介绍从JavaScript中的数组中过滤null?,包括了从JavaScript中的数组中过滤null?的使用技巧和注意事项,需要的朋友参考一下 要从数组中过滤null并仅显示非null值,请使用。以下是代码- 示例 要运行上述程序,您需要使用以下命令- 输出结果 在这里,我的文件名为demo148.js。这将产生以下输出-

    • 我希望你今天过得愉快。 这很直截了当。我有一个对象数组,我想在另一个数组的帮助下过滤掉它。场景如下所示: 预期输出: 尝试过的方法: #1: #2: 我主要倾向于使用过滤功能,因为我喜欢它。感谢您查看我的这个小问题。我感谢你的时间和努力。