简体   繁体   中英

Problems outputting arrays with quotation marks

I've been trying to get the following code to return two sepparate arrays within one.. for example : [ 'July 1st', '4th' ] . However, so far my code returns : [ 'July 1st, 4th' ] . Note, I need it to have the exact quotation marks.

This is my code:

function friendly(str) {
  var final = [];
  var months = {01:"January" , 02: "February", 03:"March", 04:"April", 05:"May", 06:"June", 07:"July", 08:"August", 09:"September", 10:"October", 11:"November", 12:"December"}, i, c, date1, date2, getYear1, getMonth1, getDay1, getYear2, getMonth2, getDay2;
  var days = {01: "st", 02: "nd", 03: "rd", 04: "th", 05: "th"};
  date1 = str[0];
  date1.split('-');
  date2 = str[1];
  date2.split('-');
  getYear1 = date1.substring(0, 4);
  getMonth1 = date1.substring(5, 7);
  getMonth2 = date2.substring(5, 7);
  getDay1 = date1.substring(8, 10);
  getYear2 = date2.substring(0,4);
  getMonth2 = date2.substring(5,7);
  getDay2 = date2.substring(8, 10);
  for(var key in months){
    //console.log(getMonth1.charAt(0) == 0);
    if(getMonth1.charAt(0) == 0){
      getMonth1 = getMonth1.slice(1);
    }
    if(getMonth2.charAt(0) == 0){
      getMonth2 = getMonth2.slice(1);
    }
    if(getDay1.charAt(0) == 0){
      getDay1 = getDay1.slice(1);
    }
    if(getDay2.charAt(0) == 0){
      getDay2 = getDay2.slice(1);
    }
    if(days.hasOwnProperty(getDay1)){
      getDay1 = getDay1 + days[getDay1];
    }
    if(days.hasOwnProperty(getDay2)){
      getDay2 = getDay2 + days[getDay2];
    }
    if(months.hasOwnProperty(getMonth1)){
      getMonth1 = months[getMonth1];
    }
    if(months.hasOwnProperty(getMonth2)){
      getMonth2 = months[getMonth2];
    }
    if(getMonth1 == getMonth2 && getYear1 == getYear2 && getDay1 !== getDay2){
      return [getMonth1 + ' ' + getDay1 + ', ' + getDay2.split(',')];
      //console.log(getMonth1);
    }
  else if(getMonth1 == getMonth2 && getYear1 == getYear2 && getDay1 == getDay2){
    return [getMonth1 + ' ' + getDay1 + ', ' + getYear1];
  }
  else if(getYear1 !== getYear2 && getMonth1 !== getMonth2 && getDay1 !== getDay2){
    return [getMonth1 + ' ' + getDay1 + ', ' + getMonth2 + ' '+ getDay2.split(',')];
  }
    else if(getYear1 == getYear2 && getMonth1 !== getMonth2 && getDay1 !== getDay2){
      return [getMonth1 + ' ' + getDay1 + ', ' + getMonth2 + ' '+ getDay2 + ', ' + getYear1];
    }
    else if(getYear1 == getYear2 && getMonth1 !== getMonth2 && getDay1 !== getDay2){
      return;
    }
  else if (getYear1 !== getYear2 && getMonth1 == getMonth2 && getDay1 !== getDay2){
    return [getDay1 + ', ' + getDay2.split(',')];
  }
  }

}

friendly(['2015-07-01', '2015-07-04']);

You're building a single String and wrapping it with an Array literal .

From what you've described, it looks like you want to build an Array of multiple items which are your variables.

For example

[getMonth1 + ' ' + getDay1 + ', ' + getDay2.split(',')];
//                        ^^^^^^^^^^       ^^^^^^^^^^^^^
// becomes
[getMonth1 + ' ' + getDay1, getDay2];
//                        ^^        ^
// or possibly
[getMonth1 + ' ' + getDay1].concat(getDay2.split(','));

You have posted a lot of code and very little actually pertains to your issue, when you try to debug in future consider what your variables are on each line and then you should be able to either fix or narrow down your problem to a simple example which will be much easier to understand for everyone, eg

var foo = "July", // it doesn't matter how we arrived at these variables
    bar = "1st",  // all that will matter for the question is how they
    baz = "4th";  // are used from here onwards
[foo + ' ' + bar + ', ' + baz]; // unexpected result
[foo + ' ' + bar, baz];         // expected result

There's also any number of ways you can so this with a lot less code. Here's a quick one to inspire you!

function friendly(arrDates) {
    var suffixes = ["", "st", "nd", "rd"];
    var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var result = [];
    arrDates.forEach(function(date) {
        var parts = date.split("-");
        result.push(
            months[parseInt(parts[1])] +
            " " +
            (parts[2].slice(0,1) == 0 ? parts[2].slice(1) : parts[2]) + 
            (suffixes[parseInt(parts[2])] || "th")
        );
    });
    return result;
}
result = friendly(['2015-07-01', '2015-07-04', '2015-09-16']);
console.log(result);

this prints out:

[ 'July 1st', 'July 4th', 'September 16th' ]

Eg - http://repl.it/xip

Using forEach like this means you can supply any number of dates - my demo shows 3.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM