基于键组合数组

时间:2017-04-25 13:07:33

标签: javascript jquery arrays

我将拥有9个动态数组。 我需要将它们结合起来考虑一个用于组合它们的参数,即ItemNumber。 我的大多数数组都有一个项目,除了三个可能有多个数组的数组。

所以在下面的例子中假设。

var arr1 = [
  { 'IM_Id': 1, 'IM_Name': 'Hello', 'ItemNumber': 2001 },
  { 'IM_Id': 2, 'IM_Name': 'World', 'ItemNumber': 2002 }
];
var arr2 = [
  { 'FE_Id': 2, 'FE_Name': 'Wall',     'Code': 'XYZ',  'ItemNumber': 2001 },
  { 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F', 'ItemNumber': 2002 }
];
var arr3 = [
  { 'FC_Id': 2, 'FC_Name': 'ABC',  'Value': 009, 'ItemNumber': 2001 },
  { 'FC_Id': 3, 'FC_Name': 'PQR',  'Value': 007, 'ItemNumber': 2001 },
  { 'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004, 'ItemNumber': 2002 },
  { 'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002, 'ItemNumber': 2002 }
];

在上面的数组中,arr1和arr2只有一个具有ItemNumber 2001的项目,而对于ItemNumber 2002则相同。 但是,arr3对于两个项目编号都有2个项目。

因此,在创建结果数组时,将重复考虑具有单个项目的数组,以考虑具有倍数的其他数组项。

因此得到的数组将如下所示。

 var resultingArray = [
  { 'IM_Id': 1, 'IM_Name': 'Hello', 'FE_Id': 2, 'FE_Name': 'Wall', 'Code': 'XYZ',
    'FC_Id': 2, 'FC_Name': 'ABC', 'Value': 009 },
  { 'IM_Id': 1, 'IM_Name': 'Hello', 'FE_Id': 2, 'FE_Name': 'Wall', 'Code': 'XYZ',
    'FC_Id': 3, 'FC_Name': 'PQR', 'Value': 007 },
  { 'IM_Id': 2, 'IM_Name': 'World', 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F',
    'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004 },
  { 'IM_Id': 2, 'IM_Name': 'World', 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F',
    'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002 }
];

你可以看到,对于ItemNumber 2001,考虑arr3与FC_Id = 2和FC_Id = 3的匹配元素,结果数组重复了arr1和arr2的项目,但是使用了不同的arr3项目。

我尝试过以下代码,但它只给了我一个类似ItemNumber的项目。

我也可以为一个ItemNumber设置多个项目。

function joinObjects() {
  var idMap = {}, key, property;
  // Iterate over arguments
  for (var i = 0; i < arguments.length; i++) {
    // Iterate over individual argument arrays (aka json1, json2)
    for (var j = 0; j < arguments[i].length; j++) {
      var currentID = arguments[i][j]['ItemMasterNumber'];
      if (!idMap[currentID]) {
        idMap[currentID] = {};
      }
      // Iterate over properties of objects in arrays (aka id, name, etc.)
      for (key in arguments[i][j]) {
        idMap[currentID][key] = arguments[i][j][key];
      }
    }
  }
  // Push properties of idMap into an array
  var newArray = [];
  for (property in idMap) {
    newArray.push(idMap[property]);
  }
  return newArray;
}

var finalArray = joinObjects(arr1, arr2, arr3);

我实际上会有9个这样的数组,其中只有3个可能有多个项目,这些项目是具有相同项目编号的多个项目。

我也在用6个这样的数组添加一个示例。

var arr1 = [{'IM_Id': 1, 'IM_Name': 'Hello', 'ItemNumber': 2001}, {'IM_Id': 2, 'IM_Name': 'World', 'ItemNumber': 2002}];
            var arr2 = [{'FE_Id': 2, 'FE_Name': 'Wall', 'Code': 'XYZ', 'ItemNumber': 2001}, {'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F', 'ItemNumber': 2002}];
            var arr3 = [{'FC_Id': 2, 'FC_Name': 'ABC', 'Value': 009, 'ItemNumber': 2001},
                {'FC_Id': 3, 'FC_Name': 'PQR', 'Value': 007, 'ItemNumber': 2001},
                {'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004, 'ItemNumber': 2002},
                {'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002, 'ItemNumber': 2002}
            ];
            var arr4 = [{'OC_Id':6,'OC_Name':'Rai','OC_Price':'$30','ItemNumber': 2001},{'OC_Id': 7,'OC_Name':'Raj','OC_Price':'$60','ItemNumber': 2002}];
            var arr5 = [{'CH_Id':4,'CH_Name':'Sen','CH_Code':'LMN','ItemNumber': 2001},{'CH_Id':7,'CH_Name':'Ken','CH_Code':'IJK','ItemNumber': 2002}];
            var arr6 = [{'CO_Id':5,'CO_Name':'xyz','CO_Value':'qqq','ItemNumber': 2001},{'CO_Id':9,'CO_Name':'pqr','CO_Code':'LMN','ItemNumber': 2001}];

结果数组应该是

var resultingArray = [
                {'IM_Id': 1, 'IM_Name': 'Hello', 'FE_Id': 2, 'FE_Name': 'Wall', 'Code': 'XYZ',
                    'FC_Id': 2, 'FC_Name': 'ABC', 'Value': 009,'OC_Id':6,'OC_Name':'Rai','OC_Price':'$30','CH_Id':4,'CH_Name':'Sen','CH_Code':'LMN',
                    'CO_Id':5,'CO_Name':'xyz','CO_Value':'qqq'
                    },
                {'IM_Id': 1, 'IM_Name': 'Hello', 'FE_Id': 2, 'FE_Name': 'Wall', 'Code': 'XYZ',
                    'FC_Id': 3, 'FC_Name': 'PQR', 'Value': 007,'OC_Id':6,'OC_Name':'Rai','OC_Price':'$30','CH_Id':4,'CH_Name':'Sen','CH_Code':'LMN',
                    'CO_Id':9,'CO_Name':'pqr','CO_Code':'LMN'
                },
                {'IM_Id': 2, 'IM_Name': 'World', 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F',
                    'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004,'OC_Id': 7,'OC_Name':'Raj','OC_Price':'$60','CH_Id':7,'CH_Name':'Ken','CH_Code':'IJK',
                    'CO_Id':"-",'CO_Name':'-','CO_Code':'-'

                },
                {'IM_Id': 2, 'IM_Name': 'World', 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F',
                    'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002,'OC_Id': 7,'OC_Name':'Raj','OC_Price':'$60','CH_Id':7,'CH_Name':'Ken','CH_Code':'IJK',
                    'CO_Id':"-",'CO_Name':'-','CO_Code':'-'

                }

另外,注意arr6有两个项目具有相同的项目编号2001而没有项目编号2002的元素。

在这种情况下,它是空的或只是一个&#34; - &#34;在结果数组中最后两个元素。

3 个答案:

答案 0 :(得分:0)

我创建了一个名为joinArrays()的函数,它接受无限参数,其中每个参数都是一个数组。

此函数循环遍历其参数。如果结果数组中存在ItemNumber的汽车不存在,我们将在结果数组中创建一个空对象。所有汽车细节都会添加到这个新对象中。

在某些情况下,您的汽车详细信息对于同一个ItemNumber具有多个值。在这种情况下,我刚刚创建了一个包含所有这些内容的数组,因为问题中没有指定。

&#13;
&#13;
var arr1 = [
  { 'IM_Id': 1, 'IM_Name': 'Hello', 'ItemNumber': 2001 },
  { 'IM_Id': 2, 'IM_Name': 'World', 'ItemNumber': 2002 }
];
var arr2 = [
  { 'FE_Id': 2, 'FE_Name': 'Wall',     'Code': 'XYZ',  'ItemNumber': 2001 },
  { 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F', 'ItemNumber': 2002 }
];
var arr3 = [
  { 'FC_Id': 2, 'FC_Name': 'ABC',  'Value': 009, 'ItemNumber': 2001 },
  { 'FC_Id': 3, 'FC_Name': 'PQR',  'Value': 007, 'ItemNumber': 2001 },
  { 'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004, 'ItemNumber': 2002 },
  { 'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002, 'ItemNumber': 2002 }
];

console.log(joinArrays(arr1, arr2, arr3));

function joinArrays() {
var resultingArray = [],
	itemNumbersAdded = [];

for (var i = 0; i < arguments.length; i++) {
    var argument = arguments[i];
    
    for (var j = 0; j < argument.length; j++) {
    	var carDetails = argument[j];
        
        if (itemNumbersAdded.indexOf(carDetails.ItemNumber) === -1) {
        	itemNumbersAdded.push(carDetails.ItemNumber);
            resultingArray[itemNumbersAdded.indexOf(carDetails.ItemNumber)] = {};
        }
        
        var resultingArrayCarDetails = resultingArray[itemNumbersAdded.indexOf(carDetails.ItemNumber)];
        
        for (var k = 0; k < Object.keys(carDetails).length; k++) {
        	var carDetailName = Object.keys(carDetails)[k];
            
            if (resultingArrayCarDetails.hasOwnProperty(carDetailName) && carDetailName !== "ItemNumber") {
         		if (!(resultingArrayCarDetails[carDetailName] instanceof Array)) {
                	resultingArrayCarDetails[carDetailName] = [resultingArrayCarDetails[carDetailName]]
                }
                
                resultingArrayCarDetails[carDetailName].push(carDetails[carDetailName]);
            } else {
            	resultingArrayCarDetails[carDetailName] = carDetails[carDetailName];
            }
        }
    }
}

return resultingArray;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您需要一个双重嵌套循环来将源数组项映射到目标项。

var arr1 = [
  { 'IM_Id': 1, 'IM_Name': 'Hello', 'ItemNumber': 2001 },
  { 'IM_Id': 2, 'IM_Name': 'World', 'ItemNumber': 2002 }
];
var arr2 = [
  { 'FE_Id': 2, 'FE_Name': 'Wall',     'Code': 'XYZ',  'ItemNumber': 2001 },
  { 'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F', 'ItemNumber': 2002 }
];
var arr3 = [
  { 'FC_Id': 2, 'FC_Name': 'ABC',  'Value': 009, 'ItemNumber': 2001 },
  { 'FC_Id': 3, 'FC_Name': 'PQR',  'Value': 007, 'ItemNumber': 2001 },
  { 'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004, 'ItemNumber': 2002 },
  { 'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002, 'ItemNumber': 2002 }
];
var arr4 = [
  { 'OC_Id': 6, 'OC_Name': 'Rai', 'OC_Price': '$30', 'ItemNumber': 2001 },
  { 'OC_Id': 7, 'OC_Name': 'Raj', 'OC_Price': '$60', 'ItemNumber': 2002 }
];
var arr5 = [
  { 'CH_Id': 4, 'CH_Name': 'Sen', 'CH_Code': 'LMN', 'ItemNumber': 2001 },
  { 'CH_Id': 7, 'CH_Name': 'Ken', 'CH_Code': 'IJK', 'ItemNumber': 2002 }
];
var arr6 = [
  { 'CO_Id': 5, 'CO_Name': 'xyz', 'CO_Value': 'qqq', 'ItemNumber': 2001 },
  { 'CO_Id': 9, 'CO_Name': 'pqr', 'CO_Code':  'LMN', 'ItemNumber': 2001 }
];

var arr7 = merge(arr3, 'ItemNumber', [arr1, arr2, arr4, arr5, arr6]);

console.log(JSON.stringify(arr7, null, 2));

function merge(target, prop, srcArr) {
  return target.map(item => {
    srcArr.forEach(arr => {
      arr.forEach(src => {
        if (src[prop] === item[prop]) {
          Object.keys(src).forEach(key => item[key] = src[key])
        }
      })
    })
    return item;
  });
}
.as-console-wrapper { top: 0; max-height: 100% !important; }

答案 2 :(得分:0)

您可以使用Object.assign:

&#13;
&#13;
var arr1 = [{'IM_Id': 1, 'IM_Name': 'Hello', 'ItemNumber': 2001}, {'IM_Id': 2, 'IM_Name': 'World', 'ItemNumber': 2002}];
            var arr2 = [{'FE_Id': 2, 'FE_Name': 'Wall', 'Code': 'XYZ', 'ItemNumber': 2001}, {'FE_Id': 3, 'FE_Name': 'WallMart', 'Code': '009F', 'ItemNumber': 2002}];
            var arr3 = [{'FC_Id': 2, 'FC_Name': 'ABC', 'Value': 009, 'ItemNumber': 2001},
                {'FC_Id': 3, 'FC_Name': 'PQR', 'Value': 007, 'ItemNumber': 2001},
                {'FC_Id': 4, 'FC_Name': 'ABCD', 'Value': 004, 'ItemNumber': 2002},
                {'FC_Id': 5, 'FC_Name': 'PQRS', 'Value': 002, 'ItemNumber': 2002}
            ];
            
            var resultArr= [];
            arr1.forEach( function(item){
              arr2.forEach( function(item2){
                if( item2.ItemNumber === item.ItemNumber)
                     {
                     //var obj = Object.assign( {} ,item2, item);
                     arr3.forEach(function(item3){
                        if( item3.ItemNumber === item.ItemNumber)
                           {
                           var obj2 = Object.assign( {},item, item2, item3);
                           resultArr.push(obj2);
                           }
                        });
                    }
              });
            });
            
            console.log(JSON.stringify( resultArr ));
&#13;
&#13;
&#13;