如何将两个 JavaScript 数组合并为一个,并按日期分组

3

你好,我是一位新手程序员,我遇到了一个问题,需要从两个数组中按日期对数据进行分组。

这是我的两个数组:

header = [
    {"2019-04-22": "Sun, Apr 22, 2019"},
    {"2019-04-21": "Sat, Apr 21, 2019"},
]

body = [
    {"2019-04-22": "doing customer support”},
    {"2019-04-22": "reply to emails"},
    {"2019-04-21": "send message to customers"},
]

如何将多个数组合并为一个数组,如下所示的示例。
combinearray = {
    "2019-04-22": [
        "Sun, Apr 22, 2019",
        "doing customer support",
        "reply to emails",
    ],
    "2019-04-21": [
        "Sat, Apr 21, 2019",
        "send message to customers",
    ],
}

对于我这个初学者来说,将两个数组数据按日期分组似乎非常困难。我需要JavaScript编程的任何答案。


1
combinearray should be obj wrapped in {} instead of [] - Maheer Ali
1
您所期望的输出不是有效的数组。 - Code Maniac
抱歉,我只能返回翻译后的文本。 - Brian Luna
1
期望的输出对我来说似乎有点微妙。为什么每个日期都是一个对象数组,而不只是"2019-04-21": [ "Sat, Apr 21, 2019", "send message to customers"]?你为每个单独的对象重复键 - 如果你只关心字符串部分,那么对象有什么意义呢? - Tyler Roper
3
我想知道为什么你想要一个嵌套和重复数据的对象结构,因为似乎这并不是必需的。我明白你的想法,但我认为你应该考虑一下。如果你有充分的理由,那就没问题,只是想指出它似乎是多余的。你已经创建了一个键值对数组,其中键(表面上)似乎没有任何作用。 - Tyler Roper
显示剩余2条评论
2个回答

4
您可以按照以下步骤完成:
  • 首先使用concat()将两个数组即headerbody组合在一起。
  • 然后在此基础上使用reduce(),并将空对象作为第二个参数(累加器的初始值)传递进去。
  • reduce()回调函数内部使用Object.keys()[0]来获取日期。
  • 检查如果日期不是累加器键的话,则将其设置为空的[]
  • 使用push()将元素添加到数组中。
注意:这样做不会删除对headerbody中真实对象的引用。

const header = [ {"2019-04-22": "Sun, Apr 22, 2019"}, {"2019-04-21": "Sat, Apr 21, 2019"} ]
const body = [ {"2019-04-22": "doing customer support"}, {"2019-04-22": "reply to emails"}, {"2019-04-21": "send message to customers"}, ]

const res = header.concat(body).reduce((ac,a) => {
  let key = Object.keys(a)[0];
  ac[key] = ac[key] || [];
  ac[key].push(a)
  return ac;
},{})
console.log(res)

然而,正如评论中提到的那样,没有必要使用带有键的对象。只需要该键的值的简单数组即可。为此,请使用push() a[key]而不是a

const header = [ {"2019-04-22": "Sun, Apr 22, 2019"}, {"2019-04-21": "Sat, Apr 21, 2019"} ]
const body = [ {"2019-04-22": "doing customer support"}, {"2019-04-22": "reply to emails"}, {"2019-04-21": "send message to customers"}, ]

const res = header.concat(body).reduce((ac,a) => {
  let key = Object.keys(a)[0];
  ac[key] = ac[key] || [];
  ac[key].push(a[key])
  return ac;
},{})
console.log(res)


3
你可以使用组合数组,然后使用reduce来处理。
  • 使用展开语法合并数组
  • 使用reduce构建所需格式的对象
  • 使用Object.entries获取日期及其相应值
  • 检查日期是否已经作为键存在于对象中,如果已经存在,则将值推入其中,否则创建一个新键

let header = [{"2019-04-22": "Sun, Apr 22, 2019"},{"2019-04-21": "Sat, Apr 21, 2019"},]

let body = [{"2019-04-22": "doing customer support"},{"2019-04-22": "reply to emails"},{"2019-04-21": "send message to customers"},]


let final = [...header,...body].reduce((op,inp) => {
  let [key,value] = Object.entries(inp)[0]
  op[key] = op[key] || []
  op[key].push(value)
  return op
},{})

console.log(final)


1
@PHPcon 很高兴能提供帮助 :) - Code Maniac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接