2017-04-17 16 views
0

グループ内の同じプロパティ値を持つ要素(たとえばデータ)を新しい要素として、新しい要素を新しい配列(newDataなど)にプッシュしようとしています。データをnewDataに変換するにはどうすればよいですか?配列内の同じプロパティ値を持つ要素を要素として新しい配列にプッシュする方法はありますか?

data = [ 
    {status: 0,name:'a'}, 
    {status: 0,name:'b'}, 
    {status: 1,name:'b'}, 
]; 

var newData = [ 
      { 
       id: 0, 
       name: 'a', 
        services: [ 
         {id: 'a', name: 'a',status: 0} 
        ] 
       }, 
       { 
        id: 1, 
        name: 'b', 
        services: [ 
         {id: 'b', name: 'b',status: 0}, 
         {id: 'b', name: 'b',status: 1}, 
        ] 
       } 
      ] 
+2

予想される出力は何ですか? – gurvinder372

+0

申し訳ありませんが、配列名を変更しました。入力はデータです。出力はnewData –

+1

どこから 'id'を取得しますか? –

答えて

5

あなたは同じ名前のグループを基準として、ハッシュテーブルを使用し、目をプッシュすることができ実際の商品はservicesです。ゼロからカウントid

var data = [{ status: 0, name: 'a' }, { status: 0, name: 'b' }, { status: 1, name: 'b' }], 
 
    grouped = data.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!hash[a.name]) { 
 
       hash[a.name] = { id: a.name, name: a.name, services: [] }; 
 
       r.push(hash[a.name]); 
 
      } 
 
      a.id = a.name; 
 
      hash[a.name].services.push(a); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

var data = [{ status: 0, name: 'a' }, { status: 0, name: 'b' }, { status: 1, name: 'b' }], 
 
    grouped = data.reduce(function (hash, id) { 
 
     return function (r, a) { 
 
      if (!hash[a.name]) { 
 
       hash[a.name] = { id: id++, name: a.name, services: [] }; 
 
       r.push(hash[a.name]); 
 
      } 
 
      a.id = a.name; 
 
      hash[a.name].services.push(a); 
 
      return r; 
 
     }; 
 
    }(Object.create(null), 0), []); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2
data = [ 
{status: 0,name:'a'}, 
{status: 0,name:'b'}, 
{status: 1,name:'b'}, 
]; 

NewData=data.reduce((newobj,obj)=>((newobj[obj.name]=newobj[obj.name]||[]).push(obj),newobj),{}); 

NEWDATAは次のようになります。

{ 
    "a":[ 
     {status: 0,name:'a'}, 
    ], 
    "b":[ 
     {status: 0,name:'b'}, 
     {status: 1,name:'b'}, 
    ] 
} 

http://jsbin.com/devucujaso/edit?console

それが存在するdoesntの場合は、単純に、新しいOBJのobj.name配列に古い配列のすべてのOBJを置きます新しい配列(|| [])を作成します。 Theresのは、まだいくつかの形成、ご希望の結果を得るために欠けているが、私は自分でそれを行うことができると思う...

+0

これは私の最初の考えでしたが、複数のプロパティ 'name'と' id'に基づく複雑なアイデンティティのためです。 –

+1

@AluanHaddad希望の結果。それはただの一歩です...私がここで何をやろうとしているのか分かりません –

+0

IDなしの部分を見逃しました。この場合、このアプローチが好ましい。ちょうどフォーマットを修正してください:p –

1

このアプローチに従ってください

  • nameとそれに対するステータスの配列のマップを作成します。
  • マップを繰り返して配列を準備します。

DEMO

var data = [ 
 
    {status: 0,name:'a'}, 
 
    {status: 0,name:'b'}, 
 
    {status: 1,name:'b'}, 
 
]; 
 

 
var map = {}; 
 
data.forEach(function(item){ 
 
map[ item.name ] = map[ item.name ] || []; 
 
map[ item.name ].push(item); 
 
}); 
 

 
var newData = Object.keys(map).map(function(name, index){ 
 
    var arr = map[ name ]; 
 
    arr = arr.map(function(arrItem){ arrItem.id = arrItem.name; return arrItem }); 
 
    return { id : index, name : name, services : arr }; 
 
}); 
 

 
console.log(newData);

3

var data = [ 
 
      {status: 0,name:'a'}, 
 
      {status: 0,name:'b'}, 
 
      {status: 1,name:'b'} 
 
     ]; 
 
var finalData = []; 
 
var i=0; 
 
data.forEach(function(datum){ 
 
          var matchingElem = finalData.find(function(elem){ 
 
          return elem.name === datum.name; 
 
      }); 
 

 
if(matchingElem) 
 
    { 
 
    matchingElem.services.push({ 
 
         "id":datum.name, 
 
         "name": datum.name, 
 
         "status": datum.status 
 
         }); 
 
    } 
 
    else{ 
 
      finalData.push({ 
 
         "id":i++, 
 
         "name":datum.name, 
 
         "services": [{ 
 
           "id":datum.name, 
 
           "name": datum.name, 
 
           "status": datum.status 
 
           }] 
 
        }); 
 
    } 
 

 
}); 
 
console.log(JSON.stringify(finalData));

+0

しかし、コードスタイルはひどいです。 '=='? –

+0

データ構造が不変の場合、同一性と等価性は同じであり、同じです。 '=='を使うのが賢明なのは 'undefined'や' null'と比較する時だけです。それでも、それは単に怠惰です。 –

+1

@AluanHaddadが修正されました。 – dev8080

1

var data = [ 
 
     {status: 0,name:'a'}, 
 
     {status: 0,name:'b'}, 
 
     {status: 1,name:'b'}, 
 
    ]; 
 

 
    var id = 0; 
 
    var finalData = data.reduce(function(acc, cur) { 
 
     var elm = acc.find(e => { 
 
     return e.name === cur.name 
 
     }); 
 
     if (elm) { 
 
     elm.services.push({ 
 
      id: cur.name, 
 
      name: cur.name, 
 
      status: cur.status 
 
     }) 
 
     } else { 
 
     acc.push({ 
 
      id: id++, 
 
      name: cur.name, 
 
      services: [{ 
 
      id: cur.name, 
 
      name: cur.name, 
 
      status: cur.status 
 
      }] 
 
     }) 
 
     } 
 
     return acc; 
 
    }, []); 
 
    
 
    console.log(finalData)

関連する問題