【问题标题】:Combine objects in array of objects with same values合并具有相同值的对象数组中的对象
【发布时间】:2020-02-08 08:40:07
【问题描述】:

这是一个包含类别的对象数组以及每个类别所属的解决方案。解决方案重复,但类别是唯一的。

const categories = [
  { category: 'Patch Leads', solution: 'Data Solutions' },
  { category: 'Cables', solution: 'Data Solutions' },

  { category: 'Nails', solution: 'Hardware' },
  { category: 'Locks', solution: 'Hardware' },
  { category: 'Screws', solution: 'Hardware' },

  { category: 'Cabinets', solution: 'Cabinet Solutions' },
  { category: 'Swing Frames', solution: 'Cabinet Solutions' },
  { category: 'Racks', solution: 'Cabinet Solutions' },

  { category: 'Fire Cables', solution: 'Fire Solutions' },

];

我需要返回一个新的解决方案对象数组。这是最终结果的格式。当像 id 的索引一样循环时,可以获得此格式的所有数据都可用,但我就是无法正确获取代码的格式。

const solutions = [
  {
    id: "0",
    name: "Data Solutions",
    categories: [
      {
        id: "0",
        name: "Cables",
        slug: "cables"
      },
      {
        id: "1",
        name: "Patch Leads",
        slug: "patch-leads"
      }
    ]
  },
  {
    id: "1",
    name: "Hardware",
    categories: [
      {
        id: "0",
        name: "Nails",
        slug: "nails"
      },
      {
        id: "1",
        name: "Locks",
        slug: "locks"
      },
      {
        id: "2",
        name: "Screws",
        slug: "screws"
      }
    ]
  },
  {
    id: "2",
    name: "Cabinet Solutions",
    categories: [
      {
        id: "0",
        name: "Cabinets",
        slug: "cabinets"
      },
      {
        id: "1",
        name: "Swing Frames",
        slug: "swing-frames"
      },
      {
        id: "2",
        name: "Racks",
        slug: "racks"
      }
    ]
  },
  {
    id: "3",
    name: "Fire Solutions",
    categories: [
      {
        id: "0",
        name: "Fire Cables",
        slug: "gire-cables"
      }
    ]
  }
]

【问题讨论】:

    标签: javascript arrays object merge


    【解决方案1】:

    您可以使用reduce() 方法来做到这一点。迭代时,如果当前项目已经存在,则将当前类别附加到现有项目。如果没有,请创建一个具有当前类别的新项目。

    const categories = [ { category: 'Patch Leads', solution: 'Data Solutions' }, { category: 'Cables', solution: 'Data Solutions' }, { category: 'Nails', solution: 'Hardware' }, { category: 'Locks', solution: 'Hardware' }, { category: 'Screws', solution: 'Hardware' }, { category: 'Cabinets', solution: 'Cabinet Solutions' }, { category: 'Swing Frames', solution: 'Cabinet Solutions' }, { category: 'Racks', solution: 'Cabinet Solutions' }, { category: 'Fire Cables', solution: 'Fire Solutions' }, ];
    
    var solutions = categories.reduce((acc, curr) => {
      let item = acc.find(item => item.name === curr.solution);
    
      if (item) {
        item.categories.push({
          "id": item.categories.length,
          "name": curr.category,
          "slug": curr.category.toLowerCase().replace(' ', '-')
        });
      } else {
        acc.push({
          "id": acc.length,
          "name": curr.solution,
          "categories": [{
            "id": 0,
            "name": curr.category,
            "slug": curr.category.toLowerCase().replace(' ', '-')
          }]
        });
      }
    
      return acc;
    }, []);
    
    console.log(solutions);

    【讨论】:

    • 我会将slug 替换为curr.category.toLowerCase().split(' ').join('-'),这就是OP 想要的
    • 谢谢@Kousha。解决了这个问题。
    【解决方案2】:

    下面的代码创建一个类别解决方案的中间数组映射,然后使用它通过映射对象的键和值生成所需格式的输出。

    const categories = [
      { category: 'Patch Leads', solution: 'Data Solutions' },
      { category: 'Cables', solution: 'Data Solutions' },
    
      { category: 'Nails', solution: 'Hardware' },
      { category: 'Locks', solution: 'Hardware' },
      { category: 'Screws', solution: 'Hardware' },
    
      { category: 'Cabinets', solution: 'Cabinet Solutions' },
      { category: 'Swing Frames', solution: 'Cabinet Solutions' },
      { category: 'Racks', solution: 'Cabinet Solutions' },
    
      { category: 'Fire Cables', solution: 'Fire Solutions' },
    
    ];
    
    const solutionMap = categories.reduce((acc,item) => {
     if(!acc[item.solution]) 
       acc[item.solution] = [];
     acc[item.solution].push(item.category); 
     return acc;
    },{});
    
    const solutions = Object.entries(solutionMap).map(([key,val],id) => ({
      id,
      name: key,
      categories: val.map((category,idx) => ({id: idx, name: category, slug: category.toLowerCase().replace(' ','-')}))
    }));
    
    console.log(solutions);

    【讨论】:

      【解决方案3】:

      您可以使用一些类来更快地重新创建对象。

      const categories = [
          { category: 'Patch Leads', solution: 'Data Solutions' },
          { category: 'Cables', solution: 'Data Solutions' },
      
          { category: 'Nails', solution: 'Hardware' },
          { category: 'Locks', solution: 'Hardware' },
          { category: 'Screws', solution: 'Hardware' },
      
          { category: 'Cabinets', solution: 'Cabinet Solutions' },
          { category: 'Swing Frames', solution: 'Cabinet Solutions' },
          { category: 'Racks', solution: 'Cabinet Solutions' },
      
          { category: 'Fire Cables', solution: 'Fire Solutions' },
      ];
      
      class category{
          constructor(id,name){
              this.id = id;
              this.name = name;
              this.slug = name;
          }
      }
      class NewOne {
          constructor(id,name,categories=[]) {
              this.id = id;
              this.name = name;
              this.categories = categories;
          }
      }
      let solutions = [];
      
      solutions.push(new NewOne(0, categories[0].solution,[new category(0,categories[0].category)]));
      
      let newArrayIndex = 0;
      let idPlusOne = 1;
      
      for(index in categories){
          if(solutions[newArrayIndex].name !== categories[index].solution){
              solutions.push(new NewOne(index, categories[index].solution,[new category(0,categories[index].category)]));
              newArrayIndex++;
              idPlusOne=1;
          }else{
              solutions[newArrayIndex].categories.push(new category(idPlusOne,categories[index].category));
              idPlusOne++;
          }
      }
      
      

      【讨论】:

        猜你喜欢
        • 2017-06-24
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 2021-04-09
        • 2021-10-09
        相关资源
        最近更新 更多