• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

Config option with array of multiple values?

Scheduled Pinned Locked Moved Development
25 Posts 3 Posters 3.6k Views 3 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • U Offline
    UncleRoger
    last edited by Oct 26, 2023, 6:55 PM

    I’m working on a module and it mostly works. I’d like to expand its functionality a bit though and to do that I’m thinking about changing an array I have into an array of multiple values. That is, I currently have defined and am using:

    validSenders: [ "mom@example.com",
                    "dad@example.com",
                    "son@example.com",
                  ]
    

    My code uses it thusly:

    if (!that.config.validSenders || that.config.validSenders.includes(mailObj.sender[0].address)) {
    
    

    What I’d like to do is change that to look like this:

    validSenders: [ { "mom@example.com", "Mom", "#ff0000" },
                    { "dad@example.com", "Dad", "#00ff00" },
                    { "son@example.com", "Son", "#0000ff" },
                  ]
    

    but I don’t know a) if that’s right, b) how I would do the check in the if statement above, and c) how I would access the other parts of each element. Heck, I don’t even know if that syntax is right. (I know nothing of Javascript.)

    Any help with this would be much appreciated. It’s totally unnecessary but I think it could enhance the usability of the module for others.

    And if I might digress for a moment, I have this code in my module:

    if (that.config.validSenders.includes(mailObj.sender[0].address)) {
       if (daysAgo >= 0 && daysAgo <= that.config.daysToDisplay) {
    

    which works fine.

    But if I combine those two IF statements, it doesn’t.

    if (that.config.validSenders.includes(mailObj.sender[0].address) && \
        daysAgo >= 0 && daysAgo <= that.config.daysToDisplay) {
    

    It doesn’t work even if I remember to remove the second closing brace at the end.

    Thanks!

    S 2 Replies Last reply Oct 26, 2023, 8:18 PM Reply Quote 0
    • S Offline
      sdetweil @UncleRoger
      last edited by sdetweil Oct 26, 2023, 8:46 PM Oct 26, 2023, 8:18 PM

      @UncleRoger said in Config option with array of multiple values?:

      great conversation topic

      validSenders: [ { "mom@example.com", "Mom", "#ff0000" },
                      { "dad@example.com", "Dad", "#00ff00" },
                      { "son@example.com", "Son", "#0000ff" },
                    ]
      

      generally when you expand the number of items in an array to objects ({}) you start to get thinking about what happens if you decide to add another entry in the object…

      so in javascript you can NAME the elements

      validSenders: [ 
                      {  name:"Mom", color:"#ff0000",url:"mom@example.com", },
                      { url"dad@example.com", name:"Dad", color:"#00ff00" },
                      {  name:"Son", url:"son@example.com",color:"#0000ff" },
                    ]
      

      that way the code is not sensitive to the order of the elements

           validSenders.forEach(sender =>{
                   if (sender.name =="Dad") {
                        do_something(sender.url)
                   }
           })
      

      you can also use the array.filter() function

      let selected_sender = validSenders.filter(sender=>{
            if(sender.url==mailObj.sender[0].address)
                 return true
           else
                 return false
       })
      if(selected_sender.length>0){
          // we found a matching sender
      }
      

      the filter function passes each element array in turn to the function
      if you want the element in the output array return true,
      if not return false

      on the combined statements you don’t need the backslash

      if (that.config.validSenders.includes(mailObj.sender[0].address) && 
          daysAgo >= 0 && daysAgo <= that.config.daysToDisplay) {
      

      but this is THREE comparisons

      • that.config.validSenders.includes(mailObj.sender[0].address)
      • daysAgo >= 0
      • daysAgo <= that.config.daysToDisplay

      the last two CANNOT be true at the same time

      maybe what you wanted was

      if (
           that.config.validSenders.includes(mailObj.sender[0].address) && 
          (daysAgo >= 0 && daysAgo <= that.config.daysToDisplay)  
           ) {
      

      this is two outer compares (with one inner)

      Sam

      How to add modules

      learning how to use browser developers window for css changes

      U 2 Replies Last reply Oct 26, 2023, 8:59 PM Reply Quote 2
      • S Offline
        sdetweil @UncleRoger
        last edited by Oct 26, 2023, 8:47 PM

        @UncleRoger note that I just edited the new validSenders array to move the element properties around… having them named insulates the code from any positioning issues…(and YOU don’t have to add any code to handle that)

        Sam

        How to add modules

        learning how to use browser developers window for css changes

        1 Reply Last reply Reply Quote 1
        • U Offline
          UncleRoger @sdetweil
          last edited by Oct 26, 2023, 8:59 PM

          @sdetweil said in Config option with array of multiple values?:

          generally when you expand the number of items in an array to objects ({}) you start to get thinking about what happens if you decide to add another entry in the object…

          so in javascript you can NAME the elements

          validSenders: [ 
                          { url:"mom@example.com", name:"Mom", color:"#ff0000" },
                          { url"dad@example.com", name:"Dad", color:"#00ff00" },
                          { url:"son@example.com", name:"Son", color:"#0000ff" },
                        ]
          

          that way the code is not sensitive to the order of the elements

               validSenders.forEach(sender =>{
                       if (sender.name =="Dad") {
                            do_something(sender.url)
                       }
               })
          

          So in this scenario, you have validSenders the array and, for example, validSenders.url as one attribute(?) of the array? In your example, where does “sender” come from? It’s not one of the named elements. Is it a sort of temporary variable that gets handed the array … object(?) … so in the first iteration of the forEach (which I assume loops through each entry in the validSenders array), sender would contain(?) url:"mom@example.com", name:“Mom”, and color:“#ff0000”? And sender.url would be “mom@example.com”?

          That makes sense. I apologize for not knowing the terminology; I’m very new to the whole OOP sort of thing.

          you can also use the array.filter() function

          let selected_sender = validSenders.filter(sender=>{
                if(sender.url==mailObj.sender[0].address)
                     return true
               else
                     return false
           })
          if(selected_sender.length>0){
              // we found a matching sender
          }
          

          the filter function passes each element array in turn to the function
          if you want the element in the output array return true,
          if not return false

          Could this return false if it doesn’t match but an index if it matches so that one could refer to validSenders.color[selected_sender] to get the right attribute?

          I really kinda wish I had a spare RPi laying around so I could do this testing on something other than my production mirror. (I mean, everyone’s aware that it’s a work-in-progress but I don’t want to muck it up.)

          • that.config.validSenders.includes(mailObj.sender[0].address)
          • daysAgo >= 0
          • daysAgo <= that.config.daysToDisplay

          the last two CANNOT be true at the same time

          I’m not sure I understand… if daysToDisplay is, say, 50 and daysAgo = 25, then the last two would both be true?

          What I’m trying to do is make sure that the sender of an e-mail is in the list of valid senders and that the date the e-mail was sent is not more than daysToDisplay days ago.

          maybe what you wanted was

          if (
               that.config.validSenders.includes(mailObj.sender[0].address) && 
              (daysAgo >= 0 && daysAgo <= that.config.daysToDisplay)  
               ) {
          

          this is two outer compares (with one inner)

          I thought I tried that but even so, I don’t understand how that’s different from what I had. I thought that “If A && B && C” would be the same as “If A && (B && C)” – in either case, all three have to be true for the whole thing to be true.

          S 1 Reply Last reply Oct 26, 2023, 10:44 PM Reply Quote 0
          • U Offline
            UncleRoger @sdetweil
            last edited by Oct 26, 2023, 9:06 PM

            @sdetweil said in Config option with array of multiple values?:

            maybe what you wanted was

            if (
                 that.config.validSenders.includes(mailObj.sender[0].address) && 
                (daysAgo >= 0 && daysAgo <= that.config.daysToDisplay)  
                 ) {
            

            this is two outer compares (with one inner)

            I just tried this and it works. Not sure why the extra set of parentheses are needed but I’m not going to argue. 8^)

            Thanks!

            1 Reply Last reply Reply Quote 0
            • S Offline
              sdetweil @UncleRoger
              last edited by sdetweil Oct 26, 2023, 10:46 PM Oct 26, 2023, 10:44 PM

              @UncleRoger array.filter() returns an array with the items that the matching function returned true
              so there is only one. no need for the index. it returned the entire object, item in the list

              sender is the name of the parameter passed to the matching function, the element of the array

              Sam

              How to add modules

              learning how to use browser developers window for css changes

              S U 2 Replies Last reply Oct 26, 2023, 10:48 PM Reply Quote 0
              • S Offline
                sdetweil @sdetweil
                last edited by Oct 26, 2023, 10:48 PM

                @UncleRoger >I really kinda wish I had a spare RPi laying

                MagicMirror will run on windows. you don’t need a pi

                Sam

                How to add modules

                learning how to use browser developers window for css changes

                1 Reply Last reply Reply Quote 0
                • U Offline
                  UncleRoger @sdetweil
                  last edited by Oct 27, 2023, 4:57 PM

                  @sdetweil
                  I got it working with the .filter function:

                  let selSender = that.config.validSenders.filter(mySender => {
                  	if (mySender.addr.toLowerCase() == mailObj.sender[0].address.toLowerCase()) 
                  		return true
                  	 else 
                  		return false
                  });
                  

                  but now I’m having a problem trying to use the returned array. In this code the adding the color element to the subject works fine (that’s there for testing), as does the setting the style.color, but if I uncomment the if statement, it crashes:

                  subject = subject + selSender[0].color;
                  //		if (selSender[0].color != undefined) {
                  			subjectWrapper.style.color = selSender[0].color;
                  //		} else {
                  

                  Is there a reason it doesn’t like that in the IF statement? Note: I also tried it as just “if (selSender[0].color) {” and assigning the value of selSender[0].color to another variable and using that other variable in the IF statement. In at least one test case there is a value in color.

                  U 1 Reply Last reply Oct 27, 2023, 5:09 PM Reply Quote 0
                  • U Offline
                    UncleRoger @UncleRoger
                    last edited by Oct 27, 2023, 5:09 PM

                    @UncleRoger said in Config option with array of multiple values?:

                    subject = subject + selSender[0].color;
                    // if (selSender[0].color != undefined) {
                    subjectWrapper.style.color = selSender[0].color;
                    // } else {

                    Is there a reason it doesn’t like that in the IF statement? Note: I also tried it as just “if (selSender[0].color) {” and assigning the value of selSender[0].color to another variable and using that other variable in the IF statement. In at least one test case there is a value in color.

                    Okay, so it looks like Javascript wants “!==”, not “!=”. Ugh.

                    Anyway, I got it working using a “switch (true)” block.

                    Thanks for all the help!

                    S 1 Reply Last reply Oct 27, 2023, 5:57 PM Reply Quote 0
                    • S Offline
                      sdetweil @UncleRoger
                      last edited by sdetweil Oct 27, 2023, 5:59 PM Oct 27, 2023, 5:57 PM

                      @UncleRoger yes the compares

                      !=
                      !==
                      !===
                      

                      are different

                      Screenshot_20231027_125711_Chrome.jpg

                      one compare s the data type too
                      2 is a number
                      “2” is a string

                      Sam

                      How to add modules

                      learning how to use browser developers window for css changes

                      U 1 Reply Last reply Oct 27, 2023, 6:43 PM Reply Quote 1
                      • 1
                      • 2
                      • 3
                      • 1 / 3
                      1 / 3
                      • First post
                        1/25
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy