2017-04-25 117 views
0

我會有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只有一個與2001 ItemNumber項和同爲2002年ItemNumber然而 具有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 } 
]; 

可以看到,考慮ARR3的匹配元素與FC_Id = 2和FC_Id = 3 ItemNumber 2001所得的陣列具有重複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

任何元素,在這種情況下,它在最後兩個元素的結果數組中取空或只是一個「 - 」。

+6

問題看起來很熟悉:http://stackoverflow.com/questions/43603443/combining -multiple-arrays –

回答

0

我創建了一個名爲joinArrays()的函數,它接受無限參數,其中每個參數都是一個數組。

該函數遍歷其參數。如果在結果數組中存在ItemNumber的汽車不存在,我們將在結果數組中創建一個空對象。所有的汽車細節都被添加到這個新的對象。

有些情況下,您的汽車詳細信息具有相同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 } 
 
]; 
 

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

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

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

 
return resultingArray; 
 
}

+0

非常感謝Toby,但輸出與預期輸出不同。 –

+0

生成的數組應該是來自其他數組的所有屬性的合併。 –

+0

@AahanaPatel啊好吧,對不起。所以你想結合物品編號匹配的所有數組中的所有信息? –

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; }

+0

非常感謝@Mr Polywhirl.But在我的情況下,我有9個數組,其中我將有3個記錄。在那種情況下,我應該如何編程上述邏輯。 –

+0

@Aahana Patel _「9個數組,其中3個有多個記錄」_你能提供一個這樣的數據的例子嗎?不知道我按照... –

+0

Polywhirl謝謝,我已經添加了6個這樣的陣列的例子。 –

0

您可以使用Object.assign:

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));