2016-11-25 1 views
2

freecodecamp에 대한 몇 가지 도전 과제를 수행 중입니다. "개체 배열 (첫 번째 인수)을 살펴보고 모든 개체의 배열을 반환하는 함수 만들기 일치하는 속성 및 값 쌍 (두 번째 인수)이 있습니다. " 그래서 내가 대답의를 보면서 다음 코드를 건너 온 :함수의 반환 값 이해

:

function whatIsInAName(collection, source) { 
    var arr = []; 
    var keys = Object.keys(source); 
    // Filter array and remove the ones that do not have the keys from source. 
    arr = collection.filter(function(obj) { 
    return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 
    }); 
    }); 

    return arr; 
} 

나는 내가 얻을 수가 캔트 무엇을합니까 collection.filter 내부 수익률 무엇인지 이해하고 왜 우리가이 두 가지가 필요합니까

return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 

두 번째 코드에서만 코드가 작동하지 않는 이유는 무엇입니까?

누군가 나에게이 사실을 설명해 주시겠습니까?

+0

성질을 지니고 있다면 이것도 아이에게 고려 될 것입니다. –

+1

함수에서 값을 반환하려면'return'을 사용해야합니다. 첫 번째 리턴은 'every'로 전달 된 함수에서 리턴됩니다. 두 번째 반환은'whatIsInAName'에서 반환됩니다. – Carcigenicate

+0

메소드에 대한 자세한 내용은 https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty를 참조하십시오. –

답변

1

이 코드 :

arr = collection.filter(function(obj) { 
    return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 
    }); 

첫째, (이 처리 여부 컬렉션의를 확인하는 주요 스크립트입니다 요소와 일치하는지 여부)

keys.every(function(key) { 
      return obj.hasOwnProperty(key) && obj[key] === source[key]; 

진실/거짓obj.hasOwnProperty(key) && obj[key] === source[key]; 조건을 기준으로 반환하십시오. source의 모든 키를 확인합니다. 값이 one key 인 경우 루프를 중단하고 false을 반환합니다. (모든 테스트 [모든 키와 값은 의 소스에서 컬렉션의 요소와 동일합니다.]) true를 반환합니다.

다음

arr = collection.filter(function(obj) { return true // false

true을 반환하는 경우, 컬렉션 arr에 전달됩니다에서 OBJ 요소 그렇지 않으면 filtered/skipped

객체의 조상이있는 경우 그것은 hasOwnProperty``없이 작동하지만 수
0

collection.filterArray.prototype.filter입니다. 특정 기준을 충족시키지 않는 배열 요소를 제거하는 데 사용됩니다. 매개 변수로 전달 된 함수는 요소가 해당 기준을 충족시키는 지 여부를 결정하는 데 사용됩니다. 반환 값이 false이면 요소가 배열에서 제거되어야 함을 의미하고 true은 요소가 배열에 있어야 함을 의미합니다.

함수에 return 문을 제공하지 않으면 배열의 모든 요소에 대해 거짓말 값인 undefined을 반환합니다.

ES6에서는 쓰기 할 필요가 없습니다 arrow functions을 사용할 수 있습니다 return :

function whatIsInAName(collection, source) { 
    var keys = Object.keys(source); 
    return collection.filter(obj => 
    keys.every(key => 
     obj.hasOwnProperty(key) && obj[key] === source[key]; 
    ) 
); 
}