удалять и считать дубликаты из массива groupedBy в Javascript - PullRequest
0 голосов
/ 31 марта 2020

У меня есть массив, который должен быть изменен таким образом, чтобы он удалял и считал дубликаты ламп для каждой комнаты. В настоящее время у меня есть следующий массив:

enter image description here

Я хочу сгруппировать их по room. Для этого я использую функцию lodash:

  groupByAndCount(lamps) {
      const groupedArray = groupBy(lamps, function(n) {
        return n.pivot.room;
      });

      return groupedArray;
    },

Это возвращает массив следующим образом: enter image description here

В основном каждая группа Object выглядит одинаково как объекты в первом массиве. Но теперь я хочу использовать написанную мной функцию для подсчета и удаления дубликатов:

removeAndCountDuplicates(lamps) {
  // map to keep track of element
  // key : the properties of lamp (e.g name, fitting)
  // value : obj
  let map = new Map();

  // loop through each object in Order.
  lamps.forEach(data => {
    // loop through each properties in data.
    let currKey = JSON.stringify(data.name);
    let currValue = map.get(currKey);

    // if key exists, increment counter.
    if (currValue) {
      currValue.count += 1;
      map.set(currKey, currValue);
    } else {
      // otherwise, set new key with in new object.
      let newObj = {
        id: data.id,
        name: data.name,
        fitting: data.fitting,
        light_color_code: data.light_color_code,
        dimmability: data.dimmability,
        shape: data.shape,
        price: data.price,
        watt: data.watt,
        lumen: data.lumen,
        type: data.type,
        article_number: data.article_number,
        count: 1,
        image: data.image
        // room: data.pivot.room
      };
      map.set(currKey, newObj);
    }
  });

  // Make an array from map.
  const res = Array.from(map).map(e => e[1]);

  return res;
},

Результатом должен быть массив, подобный первому. Но должно содержать это:

  • 1 Лампа для каждой комнаты с подсчетом, сколько раз это происходит

Таким образом, объект должен быть таким:

id
name:
fitting:
light_color_code:
dimmability:
shape:
price:
watt:
lumen:
type:
article_number:
room:
count:

Но мне не удалось заставить функции работать вместе, поэтому он возвращает этот массив. Может ли кто-нибудь помочь мне в правильном направлении? Заранее спасибо, любая помощь приветствуется. Такое ощущение, что я почти на месте.

Некоторые примеры данных:

{
  "id": 3,
  "name": "Noxion Lucent LED Spot PAR16 GU10 4W 827 36D | Extra Warm Wit - Vervangt 50W",
  "fitting": "GU10",
  "light_color_code": "2700K - 827 - Zeer warm wit",
  "dimmability": 0,
  "shape": "Spot",
  "price": 2.44,
  "watt": 4,
  "lumen": 370,
  "type": "LED  ",
  "article_number": 234987,
  "pivot": {
    "order_id": 2,
    "lamp_id": 3,
    "room": "Garage"
  },
  "image": {
    "id": 3,
    "lamp_id": 3,
    "name": "234987",
    "path": "/storage/234987.jpg"
  }
}

1 Ответ

1 голос
/ 31 марта 2020

Поскольку в группе по вы создаете объект с ключами и массивами в качестве его значений, вы должны сначала выполнить итерации по объекту (вы можете использовать Object.entries()), а затем по его массивам.

Попробуйте передать сгруппированный объект в функцию ниже, и вы должны получить массив с правильными значениями. Вот пример для игры - https://stackblitz.com/edit/js-d2xcn3

ПРИМЕЧАНИЕ. Я использовал pivot.lamp_id (и добавил его также в объект), чтобы использовать его в качестве ключа для карты. Вы можете изменить его на другое уникальное свойство.

  const removeDuplicates = (lamps) => {
  let map = new Map();
  Object.entries(lamps).forEach(([key, value])=> {
    // loop through each object in Order.
  lamps[key].forEach(data => {
    // loop through each properties in data.
    let currKey = JSON.stringify(data.pivot.lamp_id);
    let currValue = map.get(currKey);

    // if key exists, increment counter.
    if (currValue) {
      currValue.count += 1;
      map.set(currKey, currValue);
    } else {
      // otherwise, set new key with in new object.
      let newObj = {
        lamp_id: data.pivot.lamp_id,
        id: data.id,
        name: data.name,
        fitting: data.fitting,
        light_color_code: data.light_color_code,
        dimmability: data.dimmability,
        shape: data.shape,
        price: data.price,
        watt: data.watt,
        lumen: data.lumen,
        type: data.type,
        article_number: data.article_number,
        count: 1,
        image: data.image
        // room: data.pivot.room
      };
      map.set(currKey, newObj);
    }
  });
  })
  // Make an array from map.
  const res = Array.from(map).map(e => e[1]);

  return res;
}
...