2016-12-25 18 views
4

下面我有兩個數組分組的排列:創建使用兩種不同的陣列

array1 = [{ 
    "type":"test", 
    "name":"name1"}, 
{ 
    "type":"dev", 
    "name":"name2"}] 

array2=[{ 
     "type":"test", 
     "name":"name3"}, 
     { 
     "type":"dev", 
     "name":"name4"}, 
     { 
     "type":"prod", 
     "name":"name5"}] 

我想組的兩個陣列,「類型」,並創建一個新的數組是這樣的:

finalArray=[{ 
      "type":"test", 
      "info":[{ 
         "type":"test", 
         "name":"name1"}], 
        [{ 
         "type":"test", 
         "name":"name3" 
        }]}, 
      { 
       "type":"dev", 
       "info":[{ 
         "type":"dev", 
         "name":"name2"}], 
        [{ 
         "type":"dev", 
         "name":"name4"}]}, 
      { 
       "type":"prod", 
       "info":[], 
        [{ 
         "type":"prod", 
         "name":"name5"}] 
       }] 

無論如何,我可以使用javascript,angularjs2,lodash,jquery來實現這一點。我能集團和中using lodash .groupBy. how to add your own keys for grouped output?

提及,但唯一的事情就是總是我想從第二陣列推的「信息」和第一個指數= 0指數= 1的數據創建新的對象。如果任何數組沒有「類型」,那麼「信息」數組應該有空/空值。

回答

1

它可以達到你想要的結果在JavaScript中,或使用幫手像lodash。 問題的最後一部分很難理解。如果一個數組沒有「type」,你將如何分組它們。請提供更清晰的解釋或修改您的預期輸入和輸出。

[已更新] 感謝您的解釋。這是使用普通JavaScript的解決方案。

// get uniques type from two arrays 
const uniqueTypes = new Set(array1 
          .concat(array2) 
          .map(x => x.type)); 

// loop the types, find item in both array 
// group it 
let result = Array.from(uniqueTypes).reduce((acc, curr) => { 
    const item1 = array1.find(x => x.type === curr); 
    const item2 = array2.find(x => x.type === curr); 

    const info1 = item1 ? [item1] : []; 
    const info2 = item2 ? [item2] : []; 

    acc = acc.concat({ type: curr, info: [info1, info2] }); 

    return acc; 
}, []); 


console.log(result); 

jsbin這裏:https://jsbin.com/mobezogaso/edit?js,console

+0

關於你的問題 - 「類型」: 「督促」 是舉st在第二個數組(array2)中,其餘的類型都在兩個數組中 - 因此,在最終數組中,'info'鍵將保存 - 一個空數組(array1中不存在的類型)和一個array2中的鍵/值如果我理解正確):) – sinisake

+0

根據您的解釋更新。現在很清楚。 – Chybie

+0

@Chybie - 感謝我期待的解決方案。我還有一個問題,我如何在.map(x => x.type)中動態地傳遞'type'。因爲我將它保存在一個常用的方法中,所以我可以通過將密鑰名稱作爲參數進行分組來將它們分組。 – user3878988

1

這裏是一個可行的解決方案:)。希望能幫助到你!

var array1 = [ 
 
{ 
 
"type":"test", 
 
"name":"name1" 
 
}, 
 
{ 
 
"type":"dev", 
 
"name":"name2" 
 
} 
 
] 
 

 
var array2 = [ 
 
{ 
 
"type":"test", 
 
"name":"name3" 
 
}, 
 
{ 
 
"type":"dev", 
 
"name":"name4" 
 
}, 
 
{ 
 
"type":"prod", 
 
"name":"name5" 
 
} 
 
] 
 

 

 
var newArray = array1.concat(array2); 
 
var arr1 = []; 
 
var arr2 = []; 
 
var arr3 = []; 
 
var arrTypes = []; 
 
var finalArray = []; 
 
var someArray = []; 
 

 
for(var i in newArray) 
 
{ 
 
if (arrTypes.indexOf(newArray[i].type) === -1){ 
 
    arrTypes.push(newArray[i].type); 
 
} 
 

 
if(newArray[i].type === "test"){ 
 
    arr1.push(newArray[i]); 
 
} 
 
else if(newArray[i].type === "dev"){ 
 
    arr2.push(newArray[i]); 
 
} 
 
else if(newArray[i].type === "prod"){ 
 
    arr3.push(newArray[i]); 
 
} 
 
} 
 
someArray.push(arr1); 
 
someArray.push(arr2); 
 
someArray.push(arr3); 
 

 
for(var j = 0; j < someArray.length; j++){ 
 
\t finalArray.push({ 
 
\t \t "type": arrTypes[j], 
 
\t \t "info": someArray[j] 
 
\t }); 
 
} 
 
console.log(finalArray);

2

使用_.mapValues遍歷對象值與關鍵訪問

var res = _.chain(array1) 
    .concat(array2) 
    .groupBy('type') 
    .mapValues(function(val, key) { 
     return { 
      type: key, 
      info: val 
     }; 
    }) 
    .values() 
    .value(); 
0

和短(不可讀?)ES6溶液:

  1. 陣列的毗連
  2. 減少陣列成一個Map對象,與該類型的關鍵
  3. 獲取條目迭代器 - 鍵(型) - 值(對象的數組)
  4. 使用蔓延到進入迭代器轉換爲數組
  5. Array#Map條目的數組類型/ info對象

const array1 = [{"type":"test","name":"name1"},{"type":"dev","name":"name2"}]; 
 
const array2=[{"type":"test","name":"name3"},{"type":"dev","name":"name4"},{"type":"prod","name":"name5"}]; 
 

 
const result = [...array1.concat(array2).reduce((r, o) => { 
 
    r.has(o.type) ? r.get(o.type).push(o) : r.set(o.type, [o]); 
 
    return r; 
 
    }, new Map).entries()] 
 
    .map(([type, info]) => ({ 
 
    type, info 
 
    })); 
 

 
console.log(result);