2017-04-17 67 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

對不起,我改變了數組名稱,輸入是數據,輸出是新數據 –

+1

你從哪裏得到'id'? –

回答

5

你可以使用一個哈希表作爲參照組具有相同的名稱,並推動日e實際項目爲services

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

隨着id從零開始計數。

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

你只需把舊的陣列的每一個OBJ到新obj的obj.name數組,如果它不存在但創建一個新的數組(|| [])。 的Theres仍然有一些失蹤成形得到你想要的結果,但我認爲你可以做你自己...

+0

這是我的第一個想法,但似乎要求是基於多個屬性'name'和'複雜的身份id' –

+1

@AluanHaddad你現在可以映射NewData得到期望的結果。這只是一步...作爲theres沒有* id *在* data *我不知道他期望我在這裏做什麼 –

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

相關問題