2014-11-09 1 views
0

자바 스크립트에서 객체 매개 변수를 사용하는 것이 필자가 선호하는 함수 사용 방법입니다. 함수에 필요한 매개 변수가 있는지 확인하려면 모든 객체 매개 변수 속성을 반복하고 필요한 속성이 필요할 때까지 기다리거나 (Solution 2) 오류를 던집니다. 솔루션 2는 효율적으로 보이지만 함수의 여러 위치에 던져 야합니다. Solution 1은 실용적으로 보이지만 재사용 가능한 코드 조각이어야합니다. 내가보고 있어야하는 또 다른 해결책이 있습니까?개체 매개 변수가 모두 require 속성을 가지고 있는지 확인하는 가장 효율적인 방법은 무엇입니까?

답변

1

당신은 실제로 당신은

function hasProperty(propName, obj){ 
    return obj.hasOwnProperty(propName); 
} 
+0

이 솔루션은 @Matti 솔루션이 여러 호출을 호출하는 동안 동시에 여러 속성을 확인하는 문제를 해결합니다. – ezraspectre

+0

OP는 "필수 매개 변수"라는 용어를 사용합니다. 이는 "필수가 아닌 (선택적)"매개 변수가있을 수도 있음을 나타냅니다 . 이 루틴은 선택적 매개 변수의 가능성을 제거합니다. 전달 된 매개 변수가 필요한 매개 변수와 정확히 일치하는지 검사합니다. 그건 제외하고, 본질적으로 문자열 표현을 비교하여 두 배열을 비교하는 접근법은 다소 이상하게 보입니다. 그렇죠? 이 버그는 실생활에서 거의 발생하지 않지만 "a"와 "b"가 필수 매개 변수 인 경우이 루틴은 전달 된 객체가'{ "a, b": true}'이면 성공을보고합니다. –

+0

@torazaburo 잘, 나는 단일 사용 버전을 포함했습니다 :) 감사합니다 btw –

1

처럼 하나의 속성을 확인할 수 있습니다

var propsNeeded = ["prop1", "prop2", "blah", "blah", "blah"], 
obj = { 
    prop1: "Hi" 
} 
function hasRequiredProperties(props, obj){ 
    return Object.keys(obj).sort().join() == propsNeeded.sort().join(); 
} 
console.log(hasRequiredProperties(propsNeeded, obj)); // false 

이 일관성을 위해 내가 require 방법을 작성하고 일부 속성이 필요할 때 항상을 사용 할 수 있습니다.

var require = function (key, object) { 

    if (typeof object[key] === 'undefined') { 
     throw new Error('Required property ' + key + ' is undefined'); 
    } 
}; 

필요한 속성이 필요한지 확인한 후 속성이 필요한지 테스트합니다. 이처럼 : 아 미트의 대답 @ 사용

var example = function (args) { 

    require('alwaysRequired', args); 

    // some code here which uses property alwaysRequired 

    if (args.something) { 
     require('sometimesRequired', args); 

     // some code here which uses property sometimesRequired 
    } 
}; 
0

아마 Object 자체를하는 방법을 추가 할 것 :

function someFunction(myObject){ 
    var objComplete = myObject.hasAllProperties(["prop1", "prop2", "prop3"], false); 
} 

업데이트 :

Object.prototype.hasAllProperties = function(props, fire){ 
    var result = Object.keys(this).sort().join() == propsNeeded.sort().join(); 

    if (fire && !result){ 
     throw new Error('Object does not define all properties'); 
    } 

    return result; 
} 

및 함수에

@ Amit의 원본과

Object.prototype.hasAllProperties = function(props, fire){ 
    var result = true; 

    $(props).each(function(i, e){ 
     if (!this.hasOwnProperty(e)) { 
      result = false; 
      return false; 
     } 
    }); 

    if (fire && !result){ 
     throw new Error('Object does not define all properties'); 
    } 

    return result; 
} 
+0

왜 당신이 그것을 원한다, 특히 프로토 타입에 대한 열거 속성으로, 또한 때 "알고리즘"결함이 있습니다 @ AmitJoki의 답변에 대한 의견을 참조하십시오)? –

+0

@torazaburo 그래, 네 말이 맞아. 처음에는 @ AmitJoki의 대답이 효과가있는 것처럼 보였습니다. 나는 그 해답을 업데이트했다. – artm

0

이 거의 자연 언어처럼 읽고

requiredParams.every(function(prop) { return prop in paramObj; }) 

으로 충분히 쉽게 할 수있는 객체의 키의 존재 여부를 확인하는 단지 일반적인 경우는 다음과 같습니다 swer, 여기에 내가 제안 무엇 . "필요한 매개 변수를 가져 오는 중 하나가 매개 변수 개체에 있습니까?"

간편한 재사용을 위해 function checkParams(paramObj, requiredParams)으로 마무리하십시오.

일반적으로 이것은 하나의 목록 (이 경우 필수 매개 변수 목록)이 다른 목록 (params 객체의 키)에 포함되어 있는지 묻는 문제입니다.그래서 우리는 목록에 포함시키기 위해 일반적인 루틴을 작성할 수 있습니다

function listIncluded(list1, list2) { 
    return list1.every(function(e) { return list2.indexOf(e) !== -1; }); 
} 

그리고 우리의 매개 변수 검사는

function checkParams(paramObj, requiredParams) { 
    return listIncluded(requiredParams, Object.keys(paramObj)); 
} 
0

이된다 당신이 개체는 세 번째없이이 기능을 사용할 수 있습니다 적어도 일부 속성이 있는지 알고 싶다면 매개 변수 :

function hasRequiredProperties(propsNeeded, obj, strict) { 

    if (strict) return Object.keys(obj).sort().join() == propsNeeded.sort().join(); 

    for (var i in propsNeeded) { 
    if (!obj.hasOwnProperty(propsNeeded[i])) return false; 
    } 
    return true; 
}; 

예 :

options = {url: { 
     protocol: 'https:', 
     hostname: 'encrypted.google.com', 
     port: '80' 
     } 
    }; 

    propsNeeded = ['protocol', 'hostname']; 

    hasRequiredProperties(propsNeeded, options.url); // true 

    hasRequiredProperties(propsNeeded, options.url, true); // false 
관련 문제