JavaScript通过ID和名称将3个对象阵列合并为1个对象数组

时间:2018-01-13 05:10:51

标签: 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组合在一起。

谢谢!

2 个答案:

答案 0 :(得分:1)

Array#concat所有数组然后使用array#reduce创建具有相同Client ID的合并对象,然后使用Object.values()提取值。

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"}],
    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"}],
    result = Object.values([].concat(arr1,arr2, arr3).reduce((r,o) => {
      r[o['Client ID']] = r[o['Client ID']] || {};
      Object.assign(r[o['Client ID']], o);
      return r;
    },{}));

console.log(result);

答案 1 :(得分:1)

有很多方法可以做到这一点。这是一个非常古老但快速的方法。它涉及两个步骤:

  1. 使用指定的键(在此示例中为“Client ID”)获取所有数组并将它们合并到一个对象中。
  2. 获取该合并对象并将其转换回数组。
  3. 您可以使用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;
    }