javascript - 为什么你是(Javascript算法挑战)
问题描述
问题
创建一个函数,它查看对象数组(第一个参数)并返回一个包含匹配名称和值对的所有对象的数组(第二个参数)。如果要包含在返回的数组中,源对象的每个名称和值对都必须存在于集合中的对象中。
例如,如果第一个参数是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二个参数是 { last: "Capulet" },那么您必须从数组中返回第三个对象(第一个参数),因为它包含名称及其值,作为第二个参数传递。
我的尝试
function whatIsInAName(collection, source) {
let filteredCollection = collection.filter((item)=>{
return collection[item].indexOf((source[item])> 0);
})
return filteredCollection;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
我的问题
我真的很难遍历对象并同时找到相关的键和值。似乎某些函数不像对数组那样对对象起作用。
非常感谢您在解决此代码问题方面的帮助?
解决方案
几个问题:
(source[item])> 0
是一个布尔表达式,所以你实际上是在做.indexOf(true)
or.indexOf(false)
,这两个都没有意义。indexOf
可以在数组中找到给定的对象,但不能用于查找满足某些条件的数组元素,这正是您想要的。你应该使用另一种方法。- 看起来第二个参数可以有几个必须匹配的属性,你需要一个循环来遍历这些属性。您的代码中没有这样的循环。
你可以这样做:
function whatIsInAName(collection, source) {
let filteredCollection = collection.filter((item) => {
return Object.entries(source).every(([key, value]) => {
return item[key] === value;
});
});
return filteredCollection;
}
let result = whatIsInAName([{ first: "Romeo", last: "Montague" },
{ first: "Tybalt", last: "Capulet" }],
{ last: "Capulet" });
console.log(result);
请注意,您可以在没有代码块而只有一个表达式的情况下使用较短的箭头函数语法。
推荐阅读
- javascript - 使用 vue.js 嵌套在数组中的过滤器数组
- java - 如何将数据的 JSON 格式转换为 GraphQL 查询格式
- python-3.x - 雅可比矩阵:TypeError:“功能”对象不支持项目分配
- mysql - MySQL 以增量方式更新列
- c# - FlexLayout 可绑定源 -xamarin 表单 - 如何在不绑定的情况下获取数据
- java - 嵌套循环递归的时间复杂度/大 o 表示法
- reactjs - 如何使用不同的语法来减少下面代码中的行数?
- javascript - 从Angular 8中的对话框传递多个值
- sql - 父/子连接查询有和没有条件的孩子
- javascript - 如何在页面加载时将 YouTube 视频 URL 动态转换为 iframe 嵌入代码?