如何把数组对象相同的key值合并,并且把对应的id放到一个数组

例如旧数据:
var old = [

{
    id: 1,
    name: 'css',
    type: 'html'
},
{
    id: 2,
    name: 'css',
    type: 'html'
},
 {
    id: 3,
    name: 'javacript',
    type: 'code'
},
{
    id: 4,
    name: 'javacript',
    type: 'code'
}

]
想得到的 var new = [

{
    id: [1,2],
    name: 'css',
    type: 'html'
},
 {
    id: [3,4],
    name: 'javacript',
    type: 'code'
},

]
希望把相同name的对象合并,并且把对应的id放到一个数组

阅读 8.1k
评论
    2 个回答
    var hash = {};
    var i = 0;
    var res = [];
    old.forEach(function(item) {
        var name = item.name;
        hash[name] ? res[hash[name] - 1].id.push(item.id) : hash[name] = ++i && res.push({
            id: [item.id],
            name: name,
            type: item.type
        })
    
    });
    console.log(JSON.stringify(res))
      • 1.3k

      从下面的数组 old

      var old = [
          {
              id: 1,
              name: 'css',
              type: 'html'
          },
          {
              id: 2,
              name: 'css',
              type: 'html'
          },
           {
              id: 3,
              name: 'javacript',
              type: 'code'
          },
          {
              id: 4,
              name: 'javacript',
              type: 'code'
          }
      ]

      得到 new

      var new = [
          {
              id: [1,2],
              name: 'css',
              type: 'html'
          },
           {
              id: [3,4],
              name: 'javacript',
              type: 'code'
          }
      ]

      实现

      var isEqual = (a, b) => a.name === b.name && b.type === b.type; 
      var create = e => {
          e.id = [e.id]; 
          return e; 
      }
      
      var getNew = old => old.reduce((acc, cur) => {
          let hasItem = acc.some(e => {
              let temp = isEqual(e, cur); 
              if (temp) e.id.push(cur.id); 
              
              return temp; 
          });
          
          if (!hasItem) acc.push(create(cur))
          
          return acc; 
      }, []);
        撰写回答

        登录后参与交流、获取后续更新提醒

        相似问题
        推荐文章