2016-12-25 3 views
4

私は2つの配列の下に持って使用してグループ化された配列を作成:二つの異なる配列

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

array2=[{ 
     "type":"test", 
     "name":"name3"}, 
     { 
     "type":"dev", 
     "name":"name4"}, 
     { 
     "type":"prod", 
     "name":"name5"}] 
私は2つの配列の「タイプ」をグループ化したい

と、このような新しい配列何か作成:

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?

しかし、唯一のことは、常に "info"のindex = 1とindex = 0にindex = 1のデータをプッシュしたいということです。いずれかの配列に "型"がない場合、 "info"配列は空の/ヌル値を持つ必要があります。

答えて

1

javascriptで、またはlodashのようなヘルパーを使用して、必要な結果を得ることは可能です。 質問の最後の部分は理解しにくいです。配列に「型」がない場合は、どのようにグループ化しますか?明確な説明を提供したり、予想される入力と出力を変更してください。

[更新された] あなたの説明をありがとう。これはプレーンな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

オブジェクト - "タイプ": "PRODは" チュあります(array2)、残りの型は両方の配列にあります - したがって、最終配列の 'info'キーが保持されます - 空の配列(配列1には存在しない型)、配列2のキー/私が正しく理解している場合): – sinisake

+0

あなたの説明の更新ベース。今は明らかです。 – Chybie

+0

@Chybie - 私が期待しているソリューションをありがとう。私は.map(x => x.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

キーが

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

と短い(読めない?)ES6ソリューションへのアクセスを持つオブジェクトの値を反復処理する使用_.mapValues

  1. 連結方式の配列
  2. キー
  3. ようなタイプで、Mapオブジェクトに配列を削減エントリのイテレータを取得します - キー(タイプ) - 配列
  4. にエントリイテレータを変換する値(オブジェクトの配列)
  5. 使用の広がりタイプ/情報へのエントリーのArray#Map配列は、あなたの質問について

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