所以我在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)
此代码:
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];
条件返回 true / false 。它检查来自source
的每个密钥。如果它发现只有one key
与条件不匹配,它将打破循环并返回false
否则(通过所有测试[来自源的所有键和值相同]集合的元素])返回true。
然后
arr = collection.filter(function(obj) {
return true // false
如果它返回true
,则来自集合的元素obj将传递给arr
,否则filtered / skipped
答案 1 :(得分: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];
)
);
}