every()some()和函数返回函数

时间:2016-09-12 21:29:28

标签: javascript

我正在研究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.

3 个答案:

答案 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如何运作:它使用everysome来验证submittedUsersgoodUsers中的每个用户是否都存在。everysome遍历数组,如果回调为数组中的每个元素返回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。