Объединение объектов с одинаковым значением первого ключа, поэтому остальные значения ключа будут добавлены в объединенный объект - PullRequest
0 голосов
/ 08 марта 2019

Привет, я нигде не могу найти ответ на свой вопрос.

Что я создаю?

Я создаю панель управления базами данных с vue.js спереди и node.js + mySQL сзади.

Есть 4 базы данных. Каждая строка базы данных имеет столбцы phone_number, e_mail, created, source_website.

Я уже сделал импорт записей из всех баз данных. Я поместил их в массив объектов.

Чего я пытаюсь достичь?

Я хотел бы объединить записи с одним и тем же адресом электронной почты и перенести каждое значение из каждой повторяющейся записи в одну объединенную запись.

Ожидаемый результат

До:

[
    {
        "number": "111111111",
            "email": "test@test.com",
        "created": "2019-02-18T15:01:18.000Z",
        "website": "http://firstwebsite.com",
        "id": 24,
    },
    {
        "number": "111222222",
        "email": "test@test.com",
        "created": "2019-02-18T15:01:18.000Z",
        "website": "http://secondwebsite.com",
        "id": 24,
    },
]

После того, как:

[
    {
        "number": "111111111, 111222222",
        "email": "test@test.com",
        "created": "2019-02-18T15:01:18.000Z",
        "website": "http://firstwebsite.com, http://secondwebsite.com",
        "id": 24,
    },
]

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Возможно, это можно упростить, но это работает.

let data = [{
    "number": "111111111",
    "email": "test@test.com",
    "created": "2019-02-18T15:01:18.000Z",
    "website": "http://firstwebsite.com",
    "id": 24,
}, {
    "number": "452",
    "email": "stack@overflow.com",
    "created": "2019-02-18T15:01:18.000Z",
    "website": "http://first.com",
    "id": 28,
}, {
    "number": "111222222",
    "email": "test@test.com",
    "created": "2019-02-18T15:01:18.000Z",
    "website": "http://secondwebsite.com",
    "id": 24,
}, {
    "number": "999",
    "email": "stack@overflow.com",
    "created": "2019-05-18T15:01:18.000Z",
    "website": "http://first.com",
    "id": 29,
}];

// Start with an object because I will use email property as key
// for an easier checking of which email has already been looped through
let result = {};

for (let i in data) {
    let item = data[i],
        // Here the checking that I talked above
        toPush = (result[item.email]) ? result[item.email] : {};
    
    for (let property in item) {
        let value = item[property];
        
        if (!toPush[property]) {
            toPush[property] = value;
        } else {
            // If the current value is not already in the value list,
            // we add it after a ", "
            if (`${toPush[property]}`.indexOf(value) === -1) {
                toPush[property] += `, ${value}`;
            }
        }
    }
    
    result[item.email] = toPush;
}

// As we want an array as final result
result = Object.values(result);

console.log(result);
0 голосов
/ 11 марта 2019

@ iArcadia, большое спасибо.Ваш ответ был очень полезным.

Я немного изменил эту функцию.Основные фьючерсы нового кода:

  • новая объединенная запись занимает только одну, самую новую дату вместо нескольких.
  • новые записи получают новые свойства (например, list_1, list_2и т.д.), что зависит от website свойства.Это позволяет системному администратору новостной рассылки отправлять новостную рассылку в разные списки.

Новая функция ниже:

mergeRecords() {
  this.subscribers.forEach((subscriber) => {
    if(subscriber.website === 'lodzkietargi') {
      subscriber.lista_1 = 1;
    }
    else if(subscriber.website === 'targiwroclaw') {
      subscriber.lista_2 = 1;
    }
    else if(subscriber.website === 'slaskietargi') {
      subscriber.lista_3 = 1;
    }
    else if(subscriber.website === 'targi') {
      subscriber.lista_4 = 1;
    }
  });
  let result = {};
  let itemId = 1;
  for (let i in this.subscribers) {
    let item = this.subscribers[i],

    toPush = (result[item.email]) ? result[item.email] : {};
    item.id = itemId
    itemId += 1;
    if (toPush.created > item.created) {
      item.created = toPush.created;
    }
    for (let property in item) {
      let value = item[property];
      if (!toPush[property]) {
          toPush[property] = value;
      } else {
        if (property === 'website') {
            toPush.website += `, ${value}`;
        }
      }
    }
    result[item.email] = toPush;
  }

  result = Object.values(result);
  this.subscribers = result;
  console.log(result);
}

Я все еще думаю, что код мог бы быть лучше.Есть много, если заявления.Во всяком случае, это может быть полезно для кого-то.Еще раз большое спасибо.Вы мне очень помогли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...