Объединить объекты в массив объектов с одинаковыми значениями - PullRequest
1 голос
/ 10 октября 2019

Здесь представлен массив объектов с категориями и решением, к которому относится каждая категория. Решения повторяются, но категории уникальны.

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 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"
      }
    ]
  }
]

Ответы [ 4 ]

1 голос
/ 10 октября 2019

Вы можете использовать метод lower () , чтобы сделать это. Во время итерации, если текущий элемент уже существует, добавьте текущую категорию к существующему элементу. Если нет, создайте новый элемент с текущей категорией.

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);
0 голосов
/ 11 октября 2019

Вы можете использовать некоторые классы для более быстрого воссоздания объектов.

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++;
    }
}

0 голосов
/ 11 октября 2019

Объединение синтаксического анализа и построения в одну операцию приводит к следующему коду:

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(function(solutions, item) {
  const solution = item.solution;
  const category = item.category;
  const solutionId = Object.keys(solutions).length;
  let solutionCategory = solutions[solution];
  
  if (!solutionCategory) {
    solutionCategory = solutions[solution] = {
      id: solutionId,
      name: solution,
      categories: []
    };
  }
  solutionCategory.categories.push({
    id: solutionCategory.categories.length.toString(),
    name: category,
    slug: category.toLowerCase().replace(' ','-')
  });
  return solutions;
}, {});

const solutions = Object.values(solutionMap);
console.log(solutions);
0 голосов
/ 10 октября 2019

Приведенный ниже код создает карту промежуточного массива решений для категории, а затем использует ее для создания выходных данных требуемого формата, используя ключи и значения сопоставленного объекта.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...