Where art thou

題目要求

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


發佈了25 篇原創文章 · 獲贊 96 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章