JavaScript 按 ID 和名称将 3 个对象数组合并为 1 个对象数组

标签 javascript arrays object multidimensional-array array-merge

我不知道最好的方法来做到这一点。我有 3 个对象数组

arr1 = [
{Client ID:"1", Client Name:"ABC", D1:"some data", D2:"more data"},
{Client ID:"2", Client Name:"DEF", D1:"some data", D2:"more data"},
{Client ID:"3", Client Name:"GHI", D1:"some data", D2:"more data"}
]


arr2 = [
{Client ID:"1", Client Name:"ABC", D3:"and more data", D4:"more more data"},
{Client ID:"2", Client Name:"DEF", D3:"and more data", D4:"more more data"},
{Client ID:"3", Client Name:"GHI", D3:"and more data", D4:"more more data"}
]

arr3 = [
{Client ID:"1", Client Name:"ABC", D5:"other data", D6:"extra Data"},
{Client ID:"2", Client Name:"DEF", D5:"other data", D6:"extra Data"},
{Client ID:"3", Client Name:"GHI", D5:"other data", D6:"extra Data"}
]

我想把它合并到

newArr = [
{Client ID:"1", Client Name:"ABC", D1:"some data", D2:"more data", D3:"and more data", D4:"more more data", D5:"other data", D6:"extra Data"},
{Client ID:"2", Client Name:"DEF", D1:"some data", D2:"more data", D3:"and more data", D4:"more more data", D5:"other data", D6:"extra Data"},
{Client ID:"3", Client Name:"GHI", D1:"some data", D2:"more data", D3:"and more data", D4:"more more data", D5:"other data", D6:"extra Data"}
]

另一个问题是,所有 3 个数组并不总是都有数据!有时我可能只组合arr2和arr3或arr1和arr3或arr1和arr2。

谢谢!

最佳答案

有多种方法可以做到这一点。这是一种非常老式但快速的方法。它包括两个步骤:

  1. 获取所有数组并使用指定键(本例中为“客户端 ID”)将它们合并到一个对象中。
  2. 获取合并的对象并将其转换回数组。

您可以使用 Lodash 或其他库来完成其中的一些工作,但即使使用纯 JavaScript 完成这一切也不会太复杂。

var arr1 = [
{"Client ID":"1", "Client Name":"ABC", D1:"some data", D2:"more data"},
{"Client ID":"2", "Client Name":"DEF", D1:"some data", D2:"more data"},
{"Client ID":"3", "Client Name":"GHI", D1:"some data", D2:"more data"}
];

var arr2 = [
{"Client ID":"1", "Client Name":"ABC", D3:"and more data", D4:"more more data"},
{"Client ID":"2", "Client Name":"DEF", D3:"and more data", D4:"more more data"},
{"Client ID":"3", "Client Name":"GHI", D3:"and more data", D4:"more more data"}
];

var arr3 = [
{"Client ID":"1", "Client Name":"ABC", D5:"other data", D6:"extra Data"},
{"Client ID":"2", "Client Name":"DEF", D5:"other data", D6:"extra Data"},
{"Client ID":"3", "Client Name":"GHI", D5:"other data", D6:"extra Data"}
];

console.log( mergeArrays( 'Client ID', [ arr1, arr2, arr3 ] ) );

function mergeArrays( key, arrays ) {
    // First merge the arrays into an object
    // indexed by the specified key
    var merged = {};
    arrays.forEach( function( array ) {
        array.forEach( function( item ) {
            var id = item[key];
            var target = merged[id];
            if( ! target ) target = merged[id] = {};
            for( var name in item ) {
                if( item.hasOwnProperty(name) ) {
                    target[name] = item[name];
                }
            }
        });
    });
    // Now convert the merged object back to an array
    var result = [];
    for( var id in merged ) {
        if( merged.hasOwnProperty(id) ) {
            result.push( merged[id] );
        }
    }
    return result;
}

关于JavaScript 按 ID 和名称将 3 个对象数组合并为 1 个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48237099/

相关文章:

java - 使用数组创建自定义方法并打印一个值

java - 打印不带括号和逗号的数组

javascript - Javascript-对象数组未按日期排序

JavaScript - 无论如何要删除对象的所有基本方法和属性但保留一个?

c++ - 为什么我的冒泡排序不适用于 double 据类型?

javascript - 无服务器 - 如何动态添加从 javascript 文件生成的资源并将其与其他资源合并?

javascript - 将javascript构造函数包装到另一个函数中

javascript - 将对象数组转换为数组数组(按属性)

javascript - 使用RequireJS优化的奇怪输出

php - 如何在 Google map API 标记上添加数字?