我正在研究NodeSchool的Functional Javascript课程。 "每一个"运动提供了一个好的用户"用于比较另一个用户列表的对象数组(也是一个对象数组)。
我希望有人能帮我看一下解决方案中发生了什么:
function checkUsersValid(goodUsers) {
return function allUsersValid(submittedUsers) {
return submittedUsers.every(function(submittedUser) {
return goodUsers.some(function(goodUser) {
return goodUser.id === submittedUser.id;
});
});
};
}
module.exports = checkUsersValid;
这些是提供的说明:
# Task
Return a function that takes a list of valid users, and returns a function that returns true if all of the supplied users exist in the original list of users.
You only need to check that the ids match.
## Example
var goodUsers = [
{ id: 1 },
{ id: 2 },
{ id: 3 }
]
// `checkUsersValid` is the function you'll define
var testAllValid = checkUsersValid(goodUsers)
testAllValid([
{ id: 2 },
{ id: 1 }
])
// => true
testAllValid([
{ id: 2 },
{ id: 4 },
{ id: 1 }
])
// => false
## Arguments
* goodUsers: a list of valid users
Use array#some and Array#every to check every user passed to your returned function exists in the array passed to the exported function.
答案 0 :(得分:3)
checkUsersValid
:function返回范围内带有goodUsers的函数。
allUsersValid
:如果所有submitUsers都包含在goodUsers中,则返回true。 goodUsers变量可通过运行checkUsersValid
创建的原始闭包来使用。
submittedUsers.every
:对每个元素运行回调。如果每个回调调用都返回true,则返回true。
goodUsers.some
:对每个元素运行回调。如果至少一次调用将返回true,则返回true。
return goodUser.id === submittedUser.id
:goodUser属于最后一个回调范围。在父范围内提交了用户。
换句话说,返回的函数检查所有提交的用户是否包含在好用户中。对于那个every
提交的用户,需要在好用户中至少引用一次(some
)。
答案 1 :(得分:2)
我添加了简要描述每个功能目的的注释。我不会以这种方式解决问题,但它解释了每个部分正在做什么
function checkUsersValid(goodUsers) {
// allUsersValid is a function that compares lists of users against each other
// if they do not match exactly return false if they do match return true
return function allUsersValid(submittedUsers) {
// .every checks to see if every element in array passes a test
// defined by the following function if every element passes
// it will return true, and if not return false
return submittedUsers.every(function(submittedUser) {
// .some is a function that tests to see if any elements pass the
// test defined by the function I.E. does this submitted user.id
// match any of the goodUsers ids if so pass true else false
// if all return true then .every returns true if any of them
// return false then .every will return false
return goodUsers.some(function(goodUser) {
return goodUser.id === submittedUser.id;
});
});
};
}
module.exports = checkUsersValid;
答案 2 :(得分:1)
我同意这个例子有点荒谬的评论,但我们仍然可以分解其工作原理。
定义的第一个函数checkUsersValid
采用一系列优秀用户,您可以在将来检查这些用户。它返回的函数allUsersValid
只要调用它就可以访问goodUsers
。这是partial application的一个例子,虽然我不确定在这种情况下我是否看到它的使用。
如果我们在没有部分应用的情况下这样做,它可能看起来像这样:
function allUsersValid(goodUsers, submittedUsers) {
return submittedUsers.every(function(submittedUser) {
return goodUsers.some(function(goodUser) {
return goodUser.id === submittedUser.id;
});
});
}
你会这样称呼:
var goodUsers = [
{ id: 1 },
{ id: 2 },
{ id: 3 }
];
allUsersValid( goodUsers, [
{ id: 2 },
{ id: 1 }
]);
现在,allUsersValid
如何运作:它使用every
和some
来验证submittedUsers
中goodUsers
中的每个用户是否都存在。every
。 some
遍历数组,如果回调为数组中的每个元素返回true,则返回true。 submittedUsers
类似,只要回调对数组中的至少一个元素返回true,它就会返回true。所以,会发生的事情是它从goodUsers
迭代每个用户,然后 - 对于每个用户 - 迭代StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
List<Transport> transports = new ArrayList<>(2);
transports.add(new WebSocketTransport(webSocketClient));
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new SimpleMessageConverter());
stompClient.setTaskScheduler(taskScheduler);
StompSessionHandlerImp stompSessionHandlerImp = new StompSessionHandlerImp();
WebSocketHttpHeaders handshakeHeaders = new WebSocketHttpHeaders();
handshakeHeaders.add("tokenGroup", "192:168:99:3::DEMO");
handshakeHeaders.add("targetNickname", "NULL_BORRAR");
stompClient.connect(stompUrlEndpoint.toString(), handshakeHeaders, stompSessionHandlerImp, new Object[0]);
中的每个用户,直到找到与提交的用户匹配的ID。如果没有为每个提交的用户找到ID,则该函数将返回false。