2017-06-18 49 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