【问题标题】:How to make the moment(date) an Object Key and the moment(time) is the value;如何使时刻(日期)成为对象键,时刻(时间)是值;
【发布时间】:2019-12-05 12:10:42
【问题描述】:

问题是,我想让 日期数组成为一个具有键值对的对象。这是数组:

let array1 = ["2020 01 12T19:00:00",
        "2019 12 30T19:00:00",
        "2019 12 27T19:00:00",
        "2019 12 25T19:00:00",
        "2019 12 06T11:00:00",
        "2019 12 02T19:00:00",
        "2019 12 02T07:00:00",
        "2020 01 25T17:00:00",
        "2020 01 13T23:00:00",
        "2019 10 28T17:00:00",
        "2019 05 27T18:00:00",
        "2019 02 28T17:00:00",
        "2019 02 27T18:00:00",
        "2019 01 28T17:00:00"]

然后,我想把它转换成://目前我在 react 上做这个

let bookedDates = {};

if(array1.length !== 0) {
 array1.map(el => {
  bookedDates = { moment(el, 'YYYY-MM-DDTHH:mm:ssZ').format('YYYY MM DD') : moment(el, 'YYYY-MM-DDTHH:mm:ssZ').format('h:mm A');
 }
}

注意我要输出的是 {DATE:TIME}。 我不希望将它们单独插入对象中,因为如果特定数据与键(日期)匹配,我需要值(时间)。然后,我会这样做:

if (Object.keys(bookedDates) === (moment(value ))) { // got from the data outside
      console.log(moment(bookedDates, 'YYYY-MM-DDTHH:mm:ssZ').format('h:mm A'));
}

请帮忙! :( 或者如果您有任何建议,请随时发布

【问题讨论】:

  • 解析的格式字符串不正确,为了匹配样本数据,它应该是moment(el, 'YYYY MM DDTHH:mm:ss'),即日期部分之间没有破折号,没有Z。

标签: javascript date object time


【解决方案1】:

对象键值已经存在于时间戳中,将它们转换为 moment.js 对象只是为了返回相同的字符串似乎效率不高。

该值只是将 24 小时时间转换为上午/下午 12 小时时间,因此在没有大型库的情况下不难转换。例如

let data = [
  "2020 01 12T19:00:00",
  "2019 12 30T19:00:00",
  "2019 12 27T19:00:00",
  "2019 12 25T19:00:00",
  "2019 12 06T11:00:00",
  "2019 12 02T19:00:00",
  "2019 12 02T07:00:00",
  "2020 01 25T17:00:00",
  "2020 01 13T23:00:00",
  "2019 10 28T17:00:00",
  "2019 05 27T18:00:00",
  "2019 02 28T17:00:00",
  "2019 02 27T18:00:00",
  "2019 01 28T17:00:00"
]

// Convert time in HH:mm:ss format to hh:mm a/p
function hrsToAP(v) {
  let [h, m, s] = v.split(':');
  let ap = h < 12? 'AM' : 'PM';
  h = h % 12 || 12;
  return h + ':' + m + ' ' + ap;
}

let dateTime = data.reduce((acc, v) => {
  let [d, t] = v.split('T');
  acc[d] = hrsToAP(t);
  return acc;
}, Object.create(null));

console.log(dateTime);

我不明白你的意思:

我想要输出的是 {DATE:TIME}。我不希望他们成为 单独插入对象中,因为我需要值(TIME),如果 特定数据与键(日期)匹配。然后,我会这样做:

if (Object.keys(bookedDates) === (moment(value ))) { // got from the data outside
  console.log(moment(bookedDates, 'YYYY-MM-DDTHH:mm:ssZ').format('h:mm A')); 
}

Object.keys 返回一个数组,moment(value) 返回一个对象,这两个对象永远不会相等。您的意思可能是:

Object.keys(bookedDates).includes(moment(value).format('YYYY MM DD'))

其中的键具有适当的格式。但这样做会简单得多:

if (bookedDates[value.split('T')[0]]) {
  // date is in bookedDates
}

可能还有其他使用sets 的方法可能更合适。

【讨论】:

    【解决方案2】:

    你可以这样做,希望这会有所帮助。 注意需要moment

    let array1 =  ["2020 01 12T19:00:00", 
                   "2019 12 30T19:00:00",  
                   "2019 12 27T19:00:00", 
                   "2019 12 25T19:00:00", 
                   "2019 12 06T11:00:00", 
                   "2019 12 02T19:00:00",  
                   "2019 12 02T07:00:00", 
                   "2020 01 25T17:00:00", 
                   "2020 01 13T23:00:00", 
                   "2019 10 28T17:00:00",  
                   "2019 05 27T18:00:00", 
                   "2019 02 28T17:00:00",  
                   "2019 02 27T18:00:00", 
                   "2019 01 28T17:00:00"]
    
    let bookedDates={} 
    array1.map(arr=>{
        bookedDates[moment(arr,'YYYY-MM-DDTHH:mm:ssZ').format('YYYY MM DD')] = moment(arr,'YYYY-MM-DDTHH:mm:ssZ').format('h:mm A') })
    
    console.log("obj",bookedDates) // Expected Output
    

    然后你添加你的逻辑

    if (Object.keys(bookedDates) === (moment(value ))) { // got from the data outside
          console.log(moment(bookedDates, 'YYYY-MM-DDTHH:mm:ssZ').format('h:mm A'));
    }
    

    假设你得到了这个格式的结果,你想根据键访问值,并且你有一个键(日期)

    // above output 
    var bookedDates={
        '2019 01 28': "5:00 PM",
        '2019 02 27': "6:00 PM",
        '2019 02 28': "5:00 PM",
        '2019 05 27': "6:00 PM",
        '2019 10 28': "5:00 PM",
        '2019 12 02': "7:00 AM",
        '2019 12 06': "11:00 AM",
        '2019 12 25': "7:00 PM",
        '2019 12 27': "7:00 PM",
        '2019 12 30': "7:00 PM",
        '2020 01 12': "7:00 PM",
        '2020 01 13': "11:00 PM",
        '2020 01 25': "5:00 PM",
    }
    
    // suppose you have the date
    var value ='2019 10 28'
    var finalValue= bookedDates[value]
    console.log(finalValue)

    【讨论】:

    • 成功了!太感谢了!但是,您知道我将如何获得与 value(data) 匹配的 Object.keys(date) 的 value(time) 吗?再次感谢!
    • 你能告诉我什么是值(时间) //假设
    • @Heisenberg 我已经添加了逻辑,请看一下。如果您认为答案解决了您的问题,请标记答案正确,谢谢
    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多