代码之家  ›  专栏  ›  技术社区  ›  realcodes

在JSON数组中合并重复值(最好使用下划线或lodash)

  •  2
  • realcodes  · 技术社区  · 7 年前

    我想合并JSON数组的某个对象,该对象具有特定键的重复值。

    我有这样的json数组:

    var data=[
        { type:"XO",
          logID:"213323",
          user:"34324234"
        },
        { type:"YO",
          logID:"2323323",
          user:"1212234"
        },
        { type:"XO",
          logID:"676323323",
          user:"45465412234"
        },
        ,
        { type:"ZO",
          logID:"1231434323",
          user:"35739434"
        }
    ]
    

    var expectedOutput:[
         { 
            type:XO,
            text: [
                {
                  logID:"213323",
                  user:"34324234"
                },
                {
                  logID:"676323323",
                  user:"45465412234"
                }
            ]
         },
         { type:"YO",
           text:[
             {
             logID:"2323323",
             user:"1212234"
            }  
          ]
         },
         {
           type:"ZO",
           text:[ 
               {
                 logID:"1231434323",
                 user:"35739434"
               } 
            ]
         }
    ]
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   ryeballar    7 年前

    您可以使用 lodash#groupBy 按对集合进行分组 type lodash#map 将每个组对象格式转换为组数组格式。要删除 数组中的属性 text lodash#omit 函数使用 lodash#partial .

    var result = _(data)
      .groupBy('type')
      .map(function(group, type) {
        return {
          type: type,
          text: _.map(group, _.partial(_.omit, _, 'type'))
        };
      })
      .value();
    

    var data = [{
        type: "XO",
        logID: "213323",
        user: "34324234"
      },
      {
        type: "YO",
        logID: "2323323",
        user: "1212234"
      },
      {
        type: "XO",
        logID: "676323323",
        user: "45465412234"
      },
      {
        type: "ZO",
        logID: "1231434323",
        user: "35739434"
      }
    ];
    
    var result = _(data)
      .groupBy('type')
      .map(function(group, type) {
        return {
          type: type,
          text: _.map(group, _.partial(_.omit, _, 'type'))
        };
      })
      .value();
      
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>