如何将数组中具有相同属性值的元素作为元素推送到新数组中?

问题描述:

我试图把具有相同属性值的元素作为一个新元素放入一个组中的数组(例如数据),并将新元素推入新的数组(例如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'? –

你可以使用一个哈希表作为参照组具有相同的名称,并推动日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; }

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 –

按照这种方法

  • 创建地图的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);

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

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)