題目要求
寫一個 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()的使用方法不熟,並且對對象數組也是第一次接觸,所以纔會有這樣的情況發生,再接再厲吧!