【问题标题】:Merge two or more arrays of JSON objects into one array, preserving uniqueness将两个或多个 JSON 对象数组合并为一个数组,保持唯一性
【发布时间】:2016-05-28 19:37:33
【问题描述】:

我有两个 JSON 对象数组,我试图按日期将它们合并到一个数组中,而不创建任何重复项。 jQuery 的 extend() 函数似乎对我不起作用。我意识到可以使用嵌套的 $.each 语句,但是这里关注的数据可能会变得非常大,所以我宁愿避免 O(Log N * Log M)...

[  
   {  
      "date":"2016-03-16",
      "timesOff":[
         "18:00 - 20:00",
         "20:00 - 22:00"
      ],
      "appointments":[  
         {  
            "projectId":"adbc5010-ea7d-4993-b442-24cce609c3f8",
            "customerName":"Johnny",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         },
         {  
            "projectId":"60e0bed4-141b-46f0-91cd-f570fb1f886d",
            "customerName":"Jimmy",
            "timeSlot":"14:00 - 16:00",
            "startTime":""
         }
      ]
   },
   {  
      "date":"2016-03-02",
      "timesOff":[
         "10:00 - 12:00",
         "14:00 - 16:00"
      ],
      "appointments":[  
         {  
            "projectId":"041b6496-4905-42b3-8057-87dc2b8c482a",
            "customerName":"Billy",
            "timeSlot":"08:00 - 10:00",
            "startTime":""
         },
         {  
            "projectId":"f6e0743a-e714-4c92-be63-a14898ec1e4d",
            "customerName":"Bob",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         }
      ]
   }
]

[
   {  
      "date":"2016-03-16",
      "timesOff":[  
         "14:00 - 16:00",
         "18:00 - 20:00"
      ],
      "appointments":[  
         {  
            "projectId":"041b6496-4905-42b3-8057-87dc2b8c482a",
            "customerName":"Billy",
            "timeSlot":"08:00 - 10:00",
            "startTime":""
         },
         {  
            "projectId":"f6e0743a-e714-4c92-be63-a14898ec1e4d",
            "customerName":"Bob",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         }
      ]
   },
   {  
      "date":"2016-03-02",
      "timesOff":[  
         "18:00 - 20:00",
         "20:00 - 22:00"
      ],
      "appointments":[  
         {  
            "projectId":"041b6496-4905-42b3-8057-87dc2b8c482a",
            "customerName":"Billy",
            "timeSlot":"08:00 - 10:00",
            "startTime":""
         },
         {  
            "projectId":"f6e0743a-e714-4c92-be63-a14898ec1e4d",
            "customerName":"Bob",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         }
      ]
   }
]

这些应该像这样合并:

[  
   {  
      "date":"2016-03-16",
      "timesOff":[
         "14:00 - 16:00",
         "18:00 - 20:00",
         "20:00 - 22:00"
      ],
      "appointments":[  
         {  
            "projectId":"041b6496-4905-42b3-8057-87dc2b8c482a",
            "customerName":"Billy",
            "timeSlot":"08:00 - 10:00",
            "startTime":""
         },
         {  
            "projectId":"f6e0743a-e714-4c92-be63-a14898ec1e4d",
            "customerName":"Bob",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         },
         {  
            "projectId":"adbc5010-ea7d-4993-b442-24cce609c3f8",
            "customerName":"Johnny",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         },
         {  
            "projectId":"60e0bed4-141b-46f0-91cd-f570fb1f886d",
            "customerName":"Jimmy",
            "timeSlot":"14:00 - 16:00",
            "startTime":""
         }
      ]
   },
   {  
      "date":"2016-03-02",
      "timesOff":[
         "10:00 - 12:00",
         "14:00 - 16:00",
         "20:00 - 22:00"
      ],
      "appointments":[  
         {  
            "projectId":"041b6496-4905-42b3-8057-87dc2b8c482a",
            "customerName":"Billy",
            "timeSlot":"08:00 - 10:00",
            "startTime":""
         },
         {  
            "projectId":"f6e0743a-e714-4c92-be63-a14898ec1e4d",
            "customerName":"Bob",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         },
         {  
            "projectId":"041b6496-4905-42b3-8057-87dc2b8c482a",
            "customerName":"Billy",
            "timeSlot":"08:00 - 10:00",
            "startTime":""
         },
         {  
            "projectId":"f6e0743a-e714-4c92-be63-a14898ec1e4d",
            "customerName":"Bob",
            "timeSlot":"10:00 - 12:00",
            "startTime":""
         }
      ]
   }
]

我首先想到的方法是同时在两个数组上分别运行 $.each,然后将值分配给临时变量(即 x[value.date] = value),然后对两个数组运行 $.extend其中。这有效,但是它返回一个类似 ["2016-03-02":Object, "2016-03-16":Object] 的数组,它不适用于应用程序的目的。如果没有“Something”:对象,如何合并这些?

提前致谢。

【问题讨论】:

  • 如果日期相同,其他一切是否都相同,还是需要更深入的测试?这是纯 JS 的任务,我怀疑 jquery 是矫枉过正
  • 日期并不总是相同的,事实上可以保证超出此数组范围的其他日期将成为焦点。这样做的底线功能是充当调度程序,保留从 get 请求中保留的信息,然后将它们存储到此数组中以防止额外的 get 请求。生成的数组可能会变得很大。

标签: javascript jquery arrays json merge


【解决方案1】:

我认为您需要两个 phpjs 工具。

http://phpjs.org/functions/array_merge/(合并数组)

http://phpjs.org/functions/array_merge_recursive(用递归模式合并数组,我想这是你的要求)

http://phpjs.org/functions/array_unique(删除数组中重复的空元素)

结合合并 + 唯一,您将获得预期的结果。只需复制并粘贴函数定义,然后使用它们即可

【讨论】:

  • 有趣...我以前从未见过这个,但它似乎确实以我需要的方式工作。是否有任何内置的 jQuery 方法可以执行您所知道的相同操作?
  • 我可能说得太早了; array_unique 方法只返回一个 JSON 对象... "Object {0: Object}"
  • PHPJS 库是纯javascript 函数的集合,它模仿PHP 语言的强大功能,但使用的是javascript。我不知道这是否存在于jquery中,但我想没有。
  • 天哪。因此,您可以避免在 array_merge_recursive 中创建 array_unique。但我不知道现在如何,我会去研究它。
  • 感谢您的帮助,我会检查一下我的功能,看看我还能做什么。这是我第一次看到 PHP JS,但它看起来很有趣,谢谢你让我知道这个漂亮的东西。
猜你喜欢
  • 2020-10-11
  • 2019-08-30
  • 2018-05-24
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多