javascript - 从对象日期数组中分离出月份,并根据日期对应的月份进行分类

标签 javascript object ecmascript-6 set

let dates = {
              '2018/07/25': [['r','red'], ['b','blue']],
              '2018/07/26': [['a','apple'], ['o','orange']],
              '2018/08/01': [['d','deer'], ['l','lion']]
            } 

预期的 newObject 是:

newObject = {
             '2018/07':{
                         '2018/07/25': [['r','red'], ['b','blue']],
                         '2018/07/26': [['a','apple'], ['o','orange']]
                       },
             '2018/08':{
                         '2018/08/01': [['d','deer'], ['l','lion']]
                       }

到目前为止我的代码:

let newObject = {};

Object.keys(dates).forEach((onedate, index) => {
    let monthdate = onedate.slice(0,7)
    newObject[monthdate] = {[onedate] : [...dates[onedate]]};       
});

以上代码的输出:

newObject = {
             '2018/07':{
                         '2018/07/26': [['a','apple'], ['o','orange']]
                       },
             '2018/08':{
                         '2018/08/01': [['d','deer'], ['l','lion']]
                       }

最后一个日期覆盖同一个循环中的上层对象

是否可以在单个循环函数中执行此操作? 我必须使用 Sets 吗?

最佳答案

我会使用 Array.reduce 来构建最终对象。

var dates = {
  '2018/07/25': [
    ['r', 'red'],
    ['b', 'blue']
  ],
  '2018/07/26': [
    ['a', 'apple'],
    ['o', 'orange']
  ],
  '2018/08/01': [
    ['d', 'deer'],
    ['l', 'lion']
  ]
}

var result = Object.keys(dates).reduce((mem, cur) => {
  var key = cur.slice(0, 7);
  mem[key] = { ...(mem[key] || {}),
    [cur]: dates[cur]
  };
  return mem;
}, {});

console.log(result);

您的代码没有产生正确的结果,因为您在添加新属性时忘记合并属性。看,当您执行 { [onedate] : [...dates[onedate]] } 时,您需要像我在下面所做的那样合并旧条目。

newObject[monthdate] = {...newObject[monthdate], [onedate] : [...dates[onedate]]};

修复后的代码:

var dates = {
  '2018/07/25': [
    ['r', 'red'],
    ['b', 'blue']
  ],
  '2018/07/26': [
    ['a', 'apple'],
    ['o', 'orange']
  ],
  '2018/08/01': [
    ['d', 'deer'],
    ['l', 'lion']
  ]
}

var newObject = {};

Object.keys(dates).forEach((onedate, index) => {
  var monthdate = onedate.slice(0, 7)
  newObject[monthdate] = { ...newObject[monthdate],
    [onedate]: [...dates[onedate]]
  };
});

console.log(newObject)

关于javascript - 从对象日期数组中分离出月份,并根据日期对应的月份进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52010918/

相关文章:

javascript - 如何从文件中导出字符串并在 NODE.js 中的另一个文件上 require() 导出的字符串?

javascript - 重定向至手机版,同时仍保留域名

javascript - document.body.style.backgroundColor 未定义

java - 使用 Java 中的 Book 类和 TestBook 类创建程序

java - 从文件中读取多个对象,就像它们在数组中一样

javascript - 从 Material UI 中的 TableRow 组件获取数据

javascript - 如何使用 Spotify Web API 进行变量解构

javascript - 如何使用 forEach 制作部分和的列表

JavaScript、v8 和函数打印

c++ - new Object() 和 Object() 有什么区别