如果日期值相同,如何将对象分组到数组中?

How do I group objects into an array, if the Date value is the same?

我有一组对象,如下所示:

[
    {
        "node_name": "node1",
        "external": "external_node1",
        "status": "online",
        "Date": "2022-05-26 08:20:27.022313"
    },
    {
        "node_name": "node2",
        "external": "external_node2",
        "status": "offline",
        "Date": "2022-05-26 20:20:27.022313"
    },
    {
        "node_name": "node3",
        "external": "external_node3",
        "status": "online",
        "Date": "2022-05-26 08:20:27.022313"
    },
    {
        "node_name": "node4",
        "external": "external_node4",
        "status": "online",
        "Date": "2022-05-26 20:20:27.022313"
    }
]

使用 JavaScript,我如何 'group' 并将所有具有匹配 Date 值的对象插入到它自己的数组中?

例如,node1 & node3 都有 "2022-05-26 08:20:27.022313" 作为它的 Date 值,而 node2 & node4 有相同的 Date 值。

如果 Date 值匹配,我如何将这些对象分类并插入到一个数组中?

您可以结合使用排序和归约来实现它:

const data = [
    {
        "node_name": "node1",
        "external": "external_node1",
        "status": "online",
        "Date": "2022-05-26 08:20:27.022313"
    },
    {
        "node_name": "node2",
        "external": "external_node2",
        "status": "offline",
        "Date": "2022-05-26 20:20:27.022313"
    },
    {
        "node_name": "node3",
        "external": "external_node3",
        "status": "online",
        "Date": "2022-05-26 08:20:27.022313"
    },
    {
        "node_name": "node4",
        "external": "external_node4",
        "status": "online",
        "Date": "2022-05-26 20:20:27.022313"
    }
];

const result = data.sort((a,b) => Date.parse(a.Date) - Date.parse(b.Date)).  
reduce((acc, data) => {
    const date = data.Date;
    acc[date] = acc[date] || [];
    acc[date] = [...acc[date], data];
    return acc;
}, {})

console.log(result);

我建议使用 Array.reduce() 将输入转换为所需的形式。

您可以将其包装在 groupBy() 函数中。这将 return 一个对象,其中包含遇到的每个值的对象数组。

const input = [ { "node_name": "node1", "external": "external_node1", "status": "online", "Date": "2022-05-26 08:20:27.022313" }, { "node_name": "node2", "external": "external_node2", "status": "offline", "Date": "2022-05-26 20:20:27.022313" }, { "node_name": "node3", "external": "external_node3", "status": "online", "Date": "2022-05-26 08:20:27.022313" }, { "node_name": "node4", "external": "external_node4", "status": "online", "Date": "2022-05-26 20:20:27.022313" } ]
 
function groupBy(arr, key) {
    return arr.reduce((acc, el) => { 
        acc[el[key]] = [...(acc[el[key]] || []), el];
        return acc;
    }, {})
}

const result = groupBy(input, 'Date');
console.log('Result:', result)
    
.as-console-wrapper { max-height: 100% !important; }

使用javascript的.filter()方法。

const newArray = oldArray.filter(data => {
    return data.Date == "2022-05-26 08:20:27.022313"
})

这将return 所有具有上述日期值的对象 (2022-05-26 08:20:27.022313) 即 node1 和 node3 到不同的数组中。