【问题标题】:JS / lodash - transform collection of objectsJS / lodash - 转换对象集合
【发布时间】:2017-02-01 19:17:05
【问题描述】:

我正在寻找一种 Lodash / JS 解决方案来从以下结构转换集合(对象数组):

let collection = [
    { category: "cat_1", banner: "banner_A", id: 1 },
    { category: "cat_1", banner: "banner_B", id: 2 },
    { category: "cat_2", banner: "banner_C", id: 3 },
    { category: "cat_2", banner: "banner_D", id: 4 },
    { category: "cat_2", banner: "banner_A", id: 5 },
    { category: "cat_3", banner: "banner_B", id: 6 }
];

进入新结构:

let newCollection = [
    { 
      category: "cat_1", 
      banners: [
        { banner: "banner_A", id: 1 },
        { banner: "banner_B", id: 2 },
      ]
    },
    { 
      category: "cat_2", 
      banners: [
        { banner: "banner_C", id: 3 },
        { banner: "banner_D", id: 4 },
        { banner: "banner_A", id: 5 },
      ]
    },
    { 
      category: "cat_3", 
      banners: [
        { banner: "banner_B", id: 6 }
      ]
    }
]

有什么想法吗? :) 干杯!

【问题讨论】:

    标签: javascript arrays lodash javascript-objects


    【解决方案1】:

    这是一个解决方案,首先按类别groups 数据,然后跨每个组maps 以获取所需形式的数据。 omit 用于从每个项目中删除类别属性。

    let result = _(collection)
        .groupBy('category')
        .map( (group, category) => ({
            category: category,
            banners: _.map(group, banner => _.omit(banner, 'category'))
        }))
        .value();
    

    【讨论】:

      【解决方案2】:

      这是一个使用纯 JS 的非常直接的方法。

      它基本上遍历集合并尝试在newCollection 数组中找到一个具有匹配category 属性的条目。如果找到一个条目,它将一个新对象推送到该条目的 banners 数组,否则它将一个全新的条目对象推送到 newCollection 数组。

      var collection = [
          { category: "cat_1", banner: "banner_A", id: 1 },
          { category: "cat_1", banner: "banner_B", id: 2 },
          { category: "cat_2", banner: "banner_C", id: 3 },
          { category: "cat_2", banner: "banner_D", id: 4 },
          { category: "cat_2", banner: "banner_A", id: 5 },
          { category: "cat_3", banner: "banner_B", id: 6 }
      ];
      
      var newCollection = [];
      collection.forEach(item => {
        var entry = newCollection.find(x => x.category === item.category);
        var content = { banner: item.banner, id: item.id };
      
        if (!entry) {
          newCollection.push({
            category: item.category,
            banners: [content]
          });
        } else {
          entry.banners.push(content);
        }
      });
      
      console.log(newCollection);

      【讨论】:

        猜你喜欢
        • 2016-04-22
        • 1970-01-01
        • 2015-10-05
        • 1970-01-01
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        相关资源
        最近更新 更多