2017-06-18 50 views
-1

這是算法挑戰如何調試這個代碼爲什麼你是?

請看起來通過對象(第一自變量)的陣列,並返回具有匹配屬性和值對(第二個參數)的所有對象的陣列的功能。源對象的每個屬性和值對必須存在於集合中的對象中(如果它將包含在返回的數組中)。

我寫過這個,但在某些情況下會出錯。這段代碼有什麼問題?

function whatIsInAName(collection,source) { 
    var ks = Object.keys(source); 
    var vals = []; 
    var arr = []; 
    var counter = ks.length; 

    for(var k in source) { 
     vals.push(source[k]); 
    } 

    for(var i = 0; i < collection.length; i++) { 
     for(var j = 0; j < counter; j++) { 
      if(collection[i].hasOwnProperty(ks[j]) && collection[i][ks[j]] === vals[j]) { 
       arr.push(collection[i]); 
      } 
     } 
     } 

    return arr; 

} 

函數調用&返回值

(1)電話:

whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }) 

(1)返回:(正確)

[{ first: "Tybalt", last: "Capulet" }] 

(2)調用:

whatIsInAName([{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }], { "a": 1 }); 

(2)返回值:(正確)

[{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }] 

(3)呼叫:

whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }); 

(3 )返回:(不正確)

[{"a":1,"b":2}, {"a":1,"b":2}, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }, { "a": 1, "b": 2, "c": 2 }] 

(4)調用:

whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 }); 

(4)返回值:(不正確的)

[{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }, { "a": 1, "b": 2, "c": 2 }] 
+3

你什麼錯誤,以及在什麼情況下,你讓他們? –

+0

請把你的評論和編輯你的問題,包括(並明確解釋),包括該數據。目前,該評論沒有說明你的問題。 –

+0

whatIsInAName([{first:「Romeo」,last:「Montague」},{first:「Mercutio」,last:null},{first:「Tybalt」,last:「Capulet」}],{last: 「}) **回答:** [{第一個:」Tybalt「,上一個:」Capulet「}](正確) whatIsInAName([{」a「:1},{」a「:1}, {「a」:1,「b」:2}],{「a」:1}); **答案:** [{「a」:1},{「a」:1},{「a」:1,「b」:2}](正確) whatIsInAName([{「a 「:1,」b「:2},{」a「:1},{」a「:1,」b「:2,」c「:2}],{」a「:1, :2}) **答案:** [{「a」:1,「b」:2},{「a」:1,「b」:2},{「a」:1},{ 「a」:1,「b」:2,「c」:2},{「a」:1,「b」:2,「c」:2}](不正確) @ScottMarcus – Arnab

回答

0
function whatIsInAName(collection, object) { 
    var passValue = Object.keys(object).length; 
    var counter = 0; 
    var correctObjects = []; 
    for (var i = 0; i < collection.length; i++) { 
     var currentObject = collection[i]; 
     counter = 0 

     for (var key in currentObject) { 
      var currentValue = currentObject[key]; 
      if (object[key] === currentValue) { 
       counter++; 
      } 
     } 

     if (counter === passValue) { 
      correctObjects.push(currentObject); 
     } 
    } 

    return correctObjects; 
} 

迭代陣列上,然後再檢查爲每一個價值。

0

問題是,當您找到匹配的元素時,您沒有跳出內部for循環。這導致如果源中多次匹配的集合中的任何元素將被重複添加到結果數組中。 您可以修復它通過添加break;

arr.push(collection[i]); 
break; 
+0

試過了......但得到了同樣的結果.... @NhonDinh – Arnab