前言
提示:题目引用自:https://chinese.freecodecamp.org ,JS中级算法部分
提示:复制代码是毫无意义的行为
一、题目描述
创建一个查看对象数组(第一个参数)的函数,并返回具有匹配的名称和值对的所有对象的数组(第二个参数)。
如果要包含在返回的数组中,则源对象的每个名称和值对都必须存在于集合中的对象中。比如,如果第一个参数是 [{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }],第二个参数是 { last: “Capulet” }。
(就是给定对象A和对象B,在A中找到包含B的对象,返回所有满足条件的对象)
二、解题思路
将集合中的对象逐个提取出来,进行对比分析。
(思路特别简单,难点在于提取对象信息的操作,代码中已经详细标明注释)
三、通过代码
function whatIsInAName(collection, source) {
let arr = [];
let test0= Object.keys(source);//获取source属性
//console.log(source[test0[0]]) 获取属性值
//console.log(test0[0]) 获取属性字符串形式
//console.log(test0)
for(let i=0; i<collection.length; i++){ //遍历collection中每一个对象
let test1 = Object.keys(collection[i]); //获取collection中第i个对象的属性
let sum = 0; // 标记source内容是否全部匹配成功
for(let j=0; j<test0.length; j++){ //遍历source对象的属性
for(let z=0; z<test1.length; z++){ //遍历collection[i]对象的属性
//判断source 与 collection 属性与值对等关系
if(test0[j]==test1[z] && collection[i][test1[z]] == source[test0[j]]){
sum++; //代表source成功匹配的对象数量
break; //若满足条件,立即退出循环,时间优化
}
}
}
if(sum == test0.length){ //判断source成功匹配的对象数量 与 所含的数是否相等,
arr.push(collection[i]); //匹配成功保存结果
}
}
return arr;
}
whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 })
总结
将头脑放清醒:动手去做这是学习的最好方式