代码之家  ›  专栏  ›  技术社区  ›  baconLikeTheKevin725

使用嵌套键和日期键合并对象的最有效方法是什么?

  •  -2
  • baconLikeTheKevin725  · 技术社区  · 6 年前

    这是一个示例数据集:

    const largeObject = {  
    "4249":{  
      "2018-07-25":[  
         {  
            "start":"2016-07-25T14:09:20.453Z",
            "end":"2016-07-25T14:17:52.147Z"
         }
      ]
    },
    "9939":{  
      "2018-07-25":[  
         {  
            "start":"2016-07-25T00:50:08.768Z",
            "end":"2016-07-25T00:53:16.514Z"
         }
      ]
    },
    "2149":{  
      "2018-07-25":[  
         {  
            "start":"2016-07-25T00:42:02.569Z",
            "end":"2016-07-25T00:43:07.689Z"
         }
      ]
    },
    "6929":{  
      "2018-07-24":[  
         {  
            "start":"2016-07-24T00:44:30.479Z",
            "end":"2016-07-24T00:46:41.315Z"
         }
      ]
    },
    "7930":{  
      "2018-07-24":[  
         {  
            "start":"2016-07-24T00:39:44.152Z",
            "end":"2016-07-24T00:44:05.420Z"
         }
      ]
    },
    "4796":{  
      "2018-07-22":[  
         {  
            "start":"2016-07-22T12:48:56.169Z",
            "end":"2016-07-22T13:38:28.136Z"
         }
      ]
    }
    }
    

    我正试图找到最有效的方法来达到这样的目的:

       const filteredObject = {
     "2018-07-25": [         
         {  
            "start":"2016-07-25T14:09:20.453Z",
            "end":"2016-07-25T14:17:52.147Z"
         },          {  
            "start":"2016-07-25T00:50:08.768Z",
            "end":"2016-07-25T00:53:16.514Z"
         },
         {  
            "start":"2016-07-25T00:42:02.569Z",
            "end":"2016-07-25T00:43:07.689Z"
         }
       ],
    "2018-07-24": [         
        {  
            "start":"2016-07-24T00:44:30.479Z",
            "end":"2016-07-24T00:46:41.315Z"
        },
        {  
            "start":"2016-07-24T00:39:44.152Z",
            "end":"2016-07-24T00:44:05.420Z"
        }
      ],
    "2018-07-22": [  
         {  
            "start":"2016-07-22T12:48:56.169Z",
            "end":"2016-07-22T13:38:28.136Z"
         }
    ]    
    };
    

    到目前为止,我已经做到了:

    const filteredObject = {}
    const newArr = []
    for(key in largeObject){
      console.log(largeObject[key])  
    }
    

    这样就去掉了随机字符串,但我还是得到了:

    { '2018-07-24': 
    [ { start: '2016-07-24T00:44:30.479Z',
        end: '2016-07-24T00:46:41.315Z' } ] }
    { '2018-07-25': 
      [ { start: '2016-07-25T00:50:08.768Z',
          end: '2016-07-25T00:53:16.514Z' } ] }
    { '2018-07-25': 
      [ { start: '2016-07-25T14:09:20.453Z',
          end: '2016-07-25T14:17:52.147Z' } ] }
      { '2018-07-24': 
      [ { start: '2016-07-24T00:39:44.152Z',
          end: '2016-07-24T00:44:05.420Z' } ] }
    { '2018-07-22': 
      [ { start: '2016-07-22T12:48:56.169Z',
          end: '2016-07-22T13:38:28.136Z' } ] }
    { '2018-07-25': 
      [ { start: '2016-07-25T00:42:02.569Z',
          end: '2016-07-25T00:43:07.689Z' } ] }
    

    这是我所得到的。我仍然需要找到一种方法来合并具有相同键值的所有数组。似乎我需要遍历这个对象,将日期作为键,并将与该日期键相关联的所有数组推到一个数组中。

    处理这种事情最好的方法是什么?我还希望尽可能高效地执行此操作,而不必每次检查日期键和/或将start/end对象推入它自己的数组时都迭代整个大型对象。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Mark    6 年前

    你可以从 Object.values() 你的原始数据。这将为您提供一个不带第一级键的值数组,您可以 reduce() . 然后对每一个都将其分解为一个键和值。添加一个数组值的键(如果它还不存在的话)并合并到数据中。

    const largeObject = {  "4249":{  "2018-07-25":[  {  "start":"2016-07-25T14:09:20.453Z","end":"2016-07-25T14:17:52.147Z"}]},"9939":{  "2018-07-25":[  {  "start":"2016-07-25T00:50:08.768Z","end":"2016-07-25T00:53:16.514Z"}]},"2149":{  "2018-07-25":[  {  "start":"2016-07-25T00:42:02.569Z","end":"2016-07-25T00:43:07.689Z"}]},"6929":{  "2018-07-24":[  {  "start":"2016-07-24T00:44:30.479Z","end":"2016-07-24T00:46:41.315Z"}]},"7930":{  "2018-07-24":[  {  "start":"2016-07-24T00:39:44.152Z","end":"2016-07-24T00:44:05.420Z"}]},"4796":{  "2018-07-22":[  {  "start":"2016-07-22T12:48:56.169Z","end":"2016-07-22T13:38:28.136Z"}]}}
        
    let filtered = Object.values(largeObject).reduce((a, c) => {
        Object.entries(c).forEach(([k, v]) => {
            (a[k] || (a[k] = [])).push(...v)
        })
        return a
    },{})
    console.log(filtered)