【问题标题】:Transform array of objects into object that contains an array of objects (Complex)将对象数组转换为包含对象数组的对象(复杂)
【发布时间】:2018-06-02 06:39:58
【问题描述】:

我正在使用 React Native Calendars 并尝试为议程组件构建我的数据。

预期的数据结构是(一个对象)

{
 '2012-05-22': [{text: 'item 1 - any js object'}],
 '2012-05-23': [{text: 'item 2 - any js object'}],
 '2012-05-24': [],
 '2012-05-25': [{text: 'item 3 - any js object'},{text: 'any js object'}],
}`

从我的 api 获取事件时,事件以以下格式返回(对象数组)`

 let eventsFetchedFromApi = [
  {startDateTime:"2018-02-01T11:10:43", comments: "First Event"},
  {startDateTime:"2018-03-01T11:12:43", comments: "Third Event"},
  {startDateTime:"2018-02-01T11:18:43", comments: "Second Event"},
 ]`

我已经设法使用以下代码将我的对象数组转换为一个对象(不幸的是,它的可读性不是很好,至少对我来说不是)。

let transformedEvents = Object.assign(...eventsFetchedFromApi.map(({ startDateTime, comments }) => ({ [startDateTime.substring(0, 10)]: [{comments: [comments]}] })));  

“transformedEvents”的结构是(几乎在那里)

{
"2018-02-01":[{"comments": ["First Event"]}],
"2018-03-01":[{"comments": ["Third Event"]}]
}

如上所示,仅显示 3 个事件中的 2 个。如果事件具有相同的日期,则只会显示一个。我想要的输出是

{
"2018-02-01":[{"comments": "First Event"}, {"comments": "Second Event"}],
"2018-03-01":[{"comments": "Third Event"}]
}

**我需要将具有相同日期的事件组合在一起。任何人都可以帮助我获得我想要的数据结构吗?我不知道如何解决这个问题。谢谢**

【问题讨论】:

  • 您想要的输出在"2018-02-01" 中具有第二个事件,但在eventsFetchedFromApi 中,第二个事件具有startDateTime of "2018-03-01T...
  • 我的错!愚蠢的混淆。

标签: javascript arrays react-native javascript-objects


【解决方案1】:

您可以使用reduce 将一组对象分组为一个由日期字符串索引的对象。如果输入和输出项不是一对一的,则不能使用map,就像您的情况一样。

const eventsFetchedFromApi=[{startDateTime:"2018-02-01T11:10:43",comments:"First Event"},{startDateTime:"2018-03-01T11:12:43",comments:"Second Event"},{startDateTime:"2018-02-01T11:18:43",comments:"Third Event"}];
const output = eventsFetchedFromApi.reduce((a, { startDateTime, comments }) => {
  const prop = startDateTime.slice(0, 10);
  if (!a[prop]) a[prop] = [];
  a[prop].push({ comments });
  return a;
}, {});
console.log(output);

【讨论】:

    【解决方案2】:

    尝试以下方法:

    var arr1 = [
      {startDateTime:"2018-02-01T11:10:43", comments: "First Event"},
      {startDateTime:"2018-03-01T11:12:43", comments: "Second Event"},
      {startDateTime:"2018-02-01T11:18:43", comments: "Third Event"},
     ];
     var result = {};
     
     arr1.forEach(function(obj){
     var date = obj.startDateTime.slice(0,10); 
      if(!result[date])
        result[date] = [];
       result[date].push({"comments" : obj.comments});
     });
     console.log(result);

    【讨论】:

      【解决方案3】:

      var resultObject = {};
      let eventsFetchedFromApi = [{
              startDateTime: "2018-02-01T11:10:43",
              comments: "First Event"
          },
          {
              startDateTime: "2018-03-01T11:12:43",
              comments: "Second Event"
          },
          {
              startDateTime: "2018-02-01T11:18:43",
              comments: "Third Event"
          },
      ]
      
      eventsFetchedFromApi.forEach((val) => {
          let date = val.startDateTime.split("T")[0];
          resultObject[date] = resultObject[date] || {};
          resultObject[date].startDateTime = val.startDateTime;
          resultObject[date].comments = resultObject[date].comments || []
          resultObject[date].comments.push({
              comments: val.comments
          });
      });
      const finalResultArray = Object.values(resultObject);
      console.log(finalResultArray);

      【讨论】:

        【解决方案4】:

        这个减速器会做你想做的事吗?

        const dt2Date = dateStr => dateStr.split("T")[0];
        const createOrPush = (obj, key, value) => obj[key] 
          ? obj[key].push(value) && obj[key] 
          : [].concat(value);
        const reducer = (redo, {startDateTime, comments}) => 
          Object.assign( redo, { [dt2Date(startDateTime)]: 
            createOrPush(redo, dt2Date(startDateTime), {comments: comments}) });
        
        const array2Convert = [
          {startDateTime:"2018-02-01T11:10:43", comments: "First Event"},
          {startDateTime:"2018-03-01T11:12:43", comments: "Third Event"},
          {startDateTime:"2018-02-01T11:18:43", comments: "Second Event"},
        ];
        
        console.log(array2Convert.reduce( reducer, {} ));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-06
          • 2015-01-03
          • 2022-01-21
          • 2017-09-11
          • 2022-06-18
          • 1970-01-01
          • 1970-01-01
          • 2021-11-04
          相关资源
          最近更新 更多