2016-11-25 79 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

它可以工作,没有'hasOwnProperty',但如果对象的祖先有属性,这些也将被考虑给孩子。 –

+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]; 
    }); 

首先,(这是检查wheter集合的主脚本元素匹配或不与源)

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

它只会根据obj.hasOwnProperty(key) && obj[key] === source[key];的条件返回true/false。它会检查source中的每个密钥。如果发现只有one key与条件不匹配,则会打破该循环,否则返回false(通过所有测试[所有键和值来自与集合的元素相同])返回true。

然后

​​

如果返回true,OBJ从集合将被传递到arr元素,否则filtered/skipped

0

collection.filter打电话给Array.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]; 
    ) 
); 
}