2017-12-08 5 views
0

내 코드에서 테스트를 실행합니다. 함수에 전달 된 속성이 존재하지 않으면 0을 반환해야합니다. 그러나 아무것도 돌려주지 않는 것. 오타를 만들었나요? 이 전달 된 객체의 length 얻을하려고 할 때 그 처음 테스트 방법이 될해서는 안개체 속성이없는 경우 반환 값

var obj = { 
    key: [1, 2, 3] 
}; 

function getAverageOfElementsAtProperty(obj, key) { 
    if (obj[key].length === 0 || Array.isArray(obj[key]) === false || obj.hasOwnProperty(key) === false) { 
    return 0; 
    } 
    var average = 0; 
    for (var i = 0; i < obj[key].length; i++) { 
    average += obj[key][i]; 
    } 
    average /= obj[key].length; 
    return average; 
} 

console.log(getAverageOfElementsAtProperty(obj, 'notKey')); 
+0

아마 적어도 일시적으로 함수에서 런타임 오류를 잡아 두어야합니다. 일치하는 키로도 0 오류로 나눗셈이 가능합니까? (또한, 조건문에서 ===에 대해 미친 것은 아닙니다.) – codemaker

+0

수표의 순서는 반대입니다. 'hasOwnProperty'가 먼저오고, 그 다음에 isArray와 length가 있어야합니다 – Slai

답변

3

당신이 당신의 함수에 배열을 전달하지 않는 경우, 그것은 실패합니다. 속성이 존재하고 단순히 if 조건의 속성에 액세스하려고 시도했는지 확인해야합니다.

이제 속성이 존재하고 배열인지 확인하기 위해 테스트를 추가하려면 배열의 항목을 검사하여 숫자인지 확인하고 더 많은 테스트를 수행해야합니다. 숫자 평균을 얻는 데 실패합니다. obj['notKey'] 이후

var obj1 = { 
 
    key: [1, 2, 3] 
 
}; 
 

 
var obj2 = { 
 
    key: [1, "test", 3] 
 
}; 
 

 
function getAverageOfElementsAtProperty(obj, key) { 
 
    if (obj[key] && Array.isArray(obj[key])) { 
 
    // Ok, we have the right property and there is an array there, 
 
    // now we have to test that each item in the array is a number 
 
    var numbers = obj[key].every(function (currentValue) { 
 
     return typeof currentValue === "number"; 
 
    }); 
 
    
 
    // Return the average if we have all numbers or 0 if not 
 
    return numbers ? getAverage(obj[key]) : 0; 
 
    } else { 
 
    return 0; 
 
    } 
 
} 
 

 
function getAverage(arr){ 
 
    var average = 0; 
 
    // Array.forEach() is much simpler than counting loops 
 
    arr.forEach(function(item) { 
 
    average += item; 
 
    }); 
 
    return average/arr.length; 
 
} 
 

 
console.log(getAverageOfElementsAtProperty(obj1, 'notkey')); // 0 
 
console.log(getAverageOfElementsAtProperty(obj1, 'key'));  // 2 
 
console.log(getAverageOfElementsAtProperty(obj2, 'key'));  // 0 - obj2 does not contain all numbers

1

하지 않습니다 : (재산이 있는지 확인하고 수학 평균을 얻을), 나는 두 가지 기능이 점을 끊을 할 정말 두 가지가 있기 때문에

존재하면 배열을 반환하지 않습니다. 따라서 .length은 정의되지 않았습니다. 나는 그것이 정의되었는지 아닌지를보기 위해 typeof으로 바꿀 것이다.

var obj = { 
    key: [1, 2, 3] 
}; 

function getAverageOfElementsAtProperty(obj, key) { 

    if (typeof obj[key] == 'undefined' || Array.isArray(obj[key]) === false || obj.hasOwnProperty(key) === false) { 
    return 0; 
    } 

    var average = 0; 
    for (var i = 0; i < obj[key].length; i++) { 
    average += obj[key][i]; 
    } 
    average /= obj[key].length; 
    return average; 
} 

console.log(getAverageOfElementsAtProperty(obj, 'notKey'));