Classifying connectivity status based on online and connected status of multiple nodes












3












$begingroup$


I need to determine the status of a parent object based on 2 variables of each of its children. I came up with a working solution, but this includes a nested "if-else if-else". Needless to say, it doesn't look very elegant.



I was wondering if there is a way to simplify this. I have muddled around with some map/reduce code, but did not get to anything that is more elegant than the code below.






const parent = {
children: [{
connected: true,
online: true

},
{
connected: true,
online: true
}
]
}


// all online & all connected => connected
// all online & some connected => partially disconnected
// all online & none connected => disconnected
// some online => partially offline
// none online => offline

const onlineArr = parent.children.map(c => c.online);
const connectedArr = parent.children.map(c => c.connected);
let status;

if (!onlineArr.includes(true)) {
status = 'Offline';
} else if (!onlineArr.includes(false)) {
if (!connectedArr.includes(true)) {
status = 'Disconnected';
} else if (!connectedArr.includes(false)) {
status = 'Connected';
} else {
status = 'Partially disconnected';
}
} else {
status = 'Partially offline';
}

console.log(status);












share|improve this question









New contributor




JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$

















    3












    $begingroup$


    I need to determine the status of a parent object based on 2 variables of each of its children. I came up with a working solution, but this includes a nested "if-else if-else". Needless to say, it doesn't look very elegant.



    I was wondering if there is a way to simplify this. I have muddled around with some map/reduce code, but did not get to anything that is more elegant than the code below.






    const parent = {
    children: [{
    connected: true,
    online: true

    },
    {
    connected: true,
    online: true
    }
    ]
    }


    // all online & all connected => connected
    // all online & some connected => partially disconnected
    // all online & none connected => disconnected
    // some online => partially offline
    // none online => offline

    const onlineArr = parent.children.map(c => c.online);
    const connectedArr = parent.children.map(c => c.connected);
    let status;

    if (!onlineArr.includes(true)) {
    status = 'Offline';
    } else if (!onlineArr.includes(false)) {
    if (!connectedArr.includes(true)) {
    status = 'Disconnected';
    } else if (!connectedArr.includes(false)) {
    status = 'Connected';
    } else {
    status = 'Partially disconnected';
    }
    } else {
    status = 'Partially offline';
    }

    console.log(status);












    share|improve this question









    New contributor




    JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$















      3












      3








      3





      $begingroup$


      I need to determine the status of a parent object based on 2 variables of each of its children. I came up with a working solution, but this includes a nested "if-else if-else". Needless to say, it doesn't look very elegant.



      I was wondering if there is a way to simplify this. I have muddled around with some map/reduce code, but did not get to anything that is more elegant than the code below.






      const parent = {
      children: [{
      connected: true,
      online: true

      },
      {
      connected: true,
      online: true
      }
      ]
      }


      // all online & all connected => connected
      // all online & some connected => partially disconnected
      // all online & none connected => disconnected
      // some online => partially offline
      // none online => offline

      const onlineArr = parent.children.map(c => c.online);
      const connectedArr = parent.children.map(c => c.connected);
      let status;

      if (!onlineArr.includes(true)) {
      status = 'Offline';
      } else if (!onlineArr.includes(false)) {
      if (!connectedArr.includes(true)) {
      status = 'Disconnected';
      } else if (!connectedArr.includes(false)) {
      status = 'Connected';
      } else {
      status = 'Partially disconnected';
      }
      } else {
      status = 'Partially offline';
      }

      console.log(status);












      share|improve this question









      New contributor




      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I need to determine the status of a parent object based on 2 variables of each of its children. I came up with a working solution, but this includes a nested "if-else if-else". Needless to say, it doesn't look very elegant.



      I was wondering if there is a way to simplify this. I have muddled around with some map/reduce code, but did not get to anything that is more elegant than the code below.






      const parent = {
      children: [{
      connected: true,
      online: true

      },
      {
      connected: true,
      online: true
      }
      ]
      }


      // all online & all connected => connected
      // all online & some connected => partially disconnected
      // all online & none connected => disconnected
      // some online => partially offline
      // none online => offline

      const onlineArr = parent.children.map(c => c.online);
      const connectedArr = parent.children.map(c => c.connected);
      let status;

      if (!onlineArr.includes(true)) {
      status = 'Offline';
      } else if (!onlineArr.includes(false)) {
      if (!connectedArr.includes(true)) {
      status = 'Disconnected';
      } else if (!connectedArr.includes(false)) {
      status = 'Connected';
      } else {
      status = 'Partially disconnected';
      }
      } else {
      status = 'Partially offline';
      }

      console.log(status);








      const parent = {
      children: [{
      connected: true,
      online: true

      },
      {
      connected: true,
      online: true
      }
      ]
      }


      // all online & all connected => connected
      // all online & some connected => partially disconnected
      // all online & none connected => disconnected
      // some online => partially offline
      // none online => offline

      const onlineArr = parent.children.map(c => c.online);
      const connectedArr = parent.children.map(c => c.connected);
      let status;

      if (!onlineArr.includes(true)) {
      status = 'Offline';
      } else if (!onlineArr.includes(false)) {
      if (!connectedArr.includes(true)) {
      status = 'Disconnected';
      } else if (!connectedArr.includes(false)) {
      status = 'Connected';
      } else {
      status = 'Partially disconnected';
      }
      } else {
      status = 'Partially offline';
      }

      console.log(status);





      const parent = {
      children: [{
      connected: true,
      online: true

      },
      {
      connected: true,
      online: true
      }
      ]
      }


      // all online & all connected => connected
      // all online & some connected => partially disconnected
      // all online & none connected => disconnected
      // some online => partially offline
      // none online => offline

      const onlineArr = parent.children.map(c => c.online);
      const connectedArr = parent.children.map(c => c.connected);
      let status;

      if (!onlineArr.includes(true)) {
      status = 'Offline';
      } else if (!onlineArr.includes(false)) {
      if (!connectedArr.includes(true)) {
      status = 'Disconnected';
      } else if (!connectedArr.includes(false)) {
      status = 'Connected';
      } else {
      status = 'Partially disconnected';
      }
      } else {
      status = 'Partially offline';
      }

      console.log(status);






      javascript






      share|improve this question









      New contributor




      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 10 hours ago









      200_success

      130k17155419




      130k17155419






      New contributor




      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 10 hours ago









      JasperZelfJasperZelf

      1162




      1162




      New contributor




      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      JasperZelf is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          1 Answer
          1






          active

          oldest

          votes


















          0












          $begingroup$

          As a function



          When you write code, even as an example, always write it as a function. A function is returnable, and thus can be written differently than non returnable flat execution.



          Comment code mismatch




          "Comments are just lies in waiting."
          ...by unknown guru.




          Your comments do not match the code. The comments specify lowercase status, your code capitalists the status. Which is correct is anyone's guess. I will assume the comments are correct and that the status is formatted upon display. (It makes the solution simpler) Changed my mind and will assume the code has been tested and is correct.



          Inefficiency === Inelegance



          The nested statements are not inelegant (in a function it would not need any else statements), its the two Array.map and three Array.includes that are very inefficient for the task at hand, which to me is ugly inelegance.



          Solution



          It is the number of online, connected children that you need to know.



          If the number of online children




          • is the same as the number of children then all are online.

          • is the less than as the number of children and not zero then some are online.

          • is zero then none are online


          The same applies for connected children.



          Thus count the two types and use the counts to return the status, as follows



          function connectionStatus(clients) {
          const count = clients.length;
          var onC = 0, conC = 0;
          for (const {connected, online} of clients) {
          conC += connected;
          onC += online;
          }
          if (onC === count) {
          if (conC === count) { return "Connected" }
          return conC ? "Partially disconnected" : "Disconnected";
          }
          return onC ? "Partially offline" : "Offline";
          }

          connectionStatus(parent.children);





          share|improve this answer











          $endgroup$













            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });






            JasperZelf is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215998%2fclassifying-connectivity-status-based-on-online-and-connected-status-of-multiple%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0












            $begingroup$

            As a function



            When you write code, even as an example, always write it as a function. A function is returnable, and thus can be written differently than non returnable flat execution.



            Comment code mismatch




            "Comments are just lies in waiting."
            ...by unknown guru.




            Your comments do not match the code. The comments specify lowercase status, your code capitalists the status. Which is correct is anyone's guess. I will assume the comments are correct and that the status is formatted upon display. (It makes the solution simpler) Changed my mind and will assume the code has been tested and is correct.



            Inefficiency === Inelegance



            The nested statements are not inelegant (in a function it would not need any else statements), its the two Array.map and three Array.includes that are very inefficient for the task at hand, which to me is ugly inelegance.



            Solution



            It is the number of online, connected children that you need to know.



            If the number of online children




            • is the same as the number of children then all are online.

            • is the less than as the number of children and not zero then some are online.

            • is zero then none are online


            The same applies for connected children.



            Thus count the two types and use the counts to return the status, as follows



            function connectionStatus(clients) {
            const count = clients.length;
            var onC = 0, conC = 0;
            for (const {connected, online} of clients) {
            conC += connected;
            onC += online;
            }
            if (onC === count) {
            if (conC === count) { return "Connected" }
            return conC ? "Partially disconnected" : "Disconnected";
            }
            return onC ? "Partially offline" : "Offline";
            }

            connectionStatus(parent.children);





            share|improve this answer











            $endgroup$


















              0












              $begingroup$

              As a function



              When you write code, even as an example, always write it as a function. A function is returnable, and thus can be written differently than non returnable flat execution.



              Comment code mismatch




              "Comments are just lies in waiting."
              ...by unknown guru.




              Your comments do not match the code. The comments specify lowercase status, your code capitalists the status. Which is correct is anyone's guess. I will assume the comments are correct and that the status is formatted upon display. (It makes the solution simpler) Changed my mind and will assume the code has been tested and is correct.



              Inefficiency === Inelegance



              The nested statements are not inelegant (in a function it would not need any else statements), its the two Array.map and three Array.includes that are very inefficient for the task at hand, which to me is ugly inelegance.



              Solution



              It is the number of online, connected children that you need to know.



              If the number of online children




              • is the same as the number of children then all are online.

              • is the less than as the number of children and not zero then some are online.

              • is zero then none are online


              The same applies for connected children.



              Thus count the two types and use the counts to return the status, as follows



              function connectionStatus(clients) {
              const count = clients.length;
              var onC = 0, conC = 0;
              for (const {connected, online} of clients) {
              conC += connected;
              onC += online;
              }
              if (onC === count) {
              if (conC === count) { return "Connected" }
              return conC ? "Partially disconnected" : "Disconnected";
              }
              return onC ? "Partially offline" : "Offline";
              }

              connectionStatus(parent.children);





              share|improve this answer











              $endgroup$
















                0












                0








                0





                $begingroup$

                As a function



                When you write code, even as an example, always write it as a function. A function is returnable, and thus can be written differently than non returnable flat execution.



                Comment code mismatch




                "Comments are just lies in waiting."
                ...by unknown guru.




                Your comments do not match the code. The comments specify lowercase status, your code capitalists the status. Which is correct is anyone's guess. I will assume the comments are correct and that the status is formatted upon display. (It makes the solution simpler) Changed my mind and will assume the code has been tested and is correct.



                Inefficiency === Inelegance



                The nested statements are not inelegant (in a function it would not need any else statements), its the two Array.map and three Array.includes that are very inefficient for the task at hand, which to me is ugly inelegance.



                Solution



                It is the number of online, connected children that you need to know.



                If the number of online children




                • is the same as the number of children then all are online.

                • is the less than as the number of children and not zero then some are online.

                • is zero then none are online


                The same applies for connected children.



                Thus count the two types and use the counts to return the status, as follows



                function connectionStatus(clients) {
                const count = clients.length;
                var onC = 0, conC = 0;
                for (const {connected, online} of clients) {
                conC += connected;
                onC += online;
                }
                if (onC === count) {
                if (conC === count) { return "Connected" }
                return conC ? "Partially disconnected" : "Disconnected";
                }
                return onC ? "Partially offline" : "Offline";
                }

                connectionStatus(parent.children);





                share|improve this answer











                $endgroup$



                As a function



                When you write code, even as an example, always write it as a function. A function is returnable, and thus can be written differently than non returnable flat execution.



                Comment code mismatch




                "Comments are just lies in waiting."
                ...by unknown guru.




                Your comments do not match the code. The comments specify lowercase status, your code capitalists the status. Which is correct is anyone's guess. I will assume the comments are correct and that the status is formatted upon display. (It makes the solution simpler) Changed my mind and will assume the code has been tested and is correct.



                Inefficiency === Inelegance



                The nested statements are not inelegant (in a function it would not need any else statements), its the two Array.map and three Array.includes that are very inefficient for the task at hand, which to me is ugly inelegance.



                Solution



                It is the number of online, connected children that you need to know.



                If the number of online children




                • is the same as the number of children then all are online.

                • is the less than as the number of children and not zero then some are online.

                • is zero then none are online


                The same applies for connected children.



                Thus count the two types and use the counts to return the status, as follows



                function connectionStatus(clients) {
                const count = clients.length;
                var onC = 0, conC = 0;
                for (const {connected, online} of clients) {
                conC += connected;
                onC += online;
                }
                if (onC === count) {
                if (conC === count) { return "Connected" }
                return conC ? "Partially disconnected" : "Disconnected";
                }
                return onC ? "Partially offline" : "Offline";
                }

                connectionStatus(parent.children);






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 7 hours ago

























                answered 7 hours ago









                Blindman67Blindman67

                8,7381521




                8,7381521






















                    JasperZelf is a new contributor. Be nice, and check out our Code of Conduct.










                    draft saved

                    draft discarded


















                    JasperZelf is a new contributor. Be nice, and check out our Code of Conduct.













                    JasperZelf is a new contributor. Be nice, and check out our Code of Conduct.












                    JasperZelf is a new contributor. Be nice, and check out our Code of Conduct.
















                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215998%2fclassifying-connectivity-status-based-on-online-and-connected-status-of-multiple%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    How to make a Squid Proxy server?

                    第一次世界大戦

                    Touch on Surface Book