题目要求
写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。
例如,如果第一个参数是 [{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }],第二个参数是 { last: “Capulet” },那么你必须从数组(第一个参数)返回其中的第三个对象,因为它包含了作为第二个参数传递的属性-值对。
即返回数组[{ first: “Tybalt”, last: “Capulet” }]
解析
题目中给出了三个参考知识点
1、Global Object
2、Object.haveOwnProperty()
这个方法会返回一个布尔值,其用来判断对象是否含有指定的属性
e.g:
o = new Object();
o.prop = 'exists';
function changeO() {
o.newprop = o.prop;
delete o.prop;
}
o.hasOwnProperty('prop'); // 返回 true
changeO();
o.hasOwnProperty('prop'); // 返回 false
3、Obeject.keys();
该函数返回一个所有元素为字符串的数组,其元素来自于从给定的对象上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。
e.g:
var arr = ["a", "b", "c"];
alert(Object.keys(arr)); // 弹出"0,1,2"
// 类数组对象
var obj = { 0 : "a", 1 : "b", 2 : "c"};
alert(Object.keys(obj)); // 弹出"0,1,2"
4、Array.filter(function(){})
本方法将生成一个满足function要求的新数组
e.g:
function isBigEnough(value) {
return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
解题思路
第一步:通过Object.keys()获取出待检测source中的key值
第二步:利用filter(function(){})完成对collection中满足要求的数据的筛选,并将其赋值给arr数组(filter函数中用设置的参数item来代表每一项)
第三步:将大象放进去
第四步:关上门
Javascript代码
function where(collection, source) {
var arr = [];
// What's in a name?
var keys = Object.keys(source);
arr = collection.filter(function(item){
for(var i = 0;i<keys.length;i++){
if(!item.hasOwnProperty(keys[i]) || item[keys[i]] !== source[keys[i]])
return false;
}
return true;
});
return arr;
}
where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
“`
结语
今天这个题目有点出人意料,其实并不难,对于filter()的使用方法不熟,并且对对象数组也是第一次接触,所以才会有这样的情况发生,再接再厉吧!