Javascript добавить ключ и значение от одного объекта к другому на основе условия регулярного выражения - PullRequest
0 голосов
/ 26 сентября 2018

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

Идея состоит в том, чтобы взять объекты crm, найти их значения просмотра страниц веб-сайта из объекта API аналитики (используя регулярное выражение match1.com. *) И добавить свойство и значение pageview к соответствующему объекту crm.

Это приложение node.js.

API-ключ CRM-объекта (выводы из CRM) / ключ / значение API

[ CollectionItem {
    '0695dw9946': null,
    fc0b0dw9437: 'example1.com',
    adf03dw9241: null
  CollectionItem {
    '095ab5946': null,
    f0b0b8643: 'example2.com',
    af03bf024: null
 }]

Объект аналитики (просмотры страниц веб-сайта по трафику ga:sourceMedium)

data:
{ kind: 'analytics#gaData',
 id:
  'https://www.googleapis.com/analytics/v3/data/ga?ids=ga:&dimensions=ga:sourceMedium&metrics=ga:pageviews&start-date=30daysAgo&end-date=today',
 query:
  { 'start-date': '30daysAgo',
    'end-date': 'today',
    ids: 'ga:',
    dimensions: 'ga:sourceMedium',
    metrics: [Array],
    'start-index': 1,
    'max-results': 1000 },
 totalsForAllResults: { 'ga:pageviews': '7450' },
 rows:
[ [ 'example2.com / referral', '7350' ], //pageviews from partner 2
['example1.com / referral', '100' ] ] //pageviews from partner 1
}}

Требуемый комбинированный вывод:

    [ CollectionItem {
    '0695dw9946': null,
    fc0b0dw9437: 'example1.com',
    websitepageviews: '100',
    adf03dw9241: null
  CollectionItem {
    '095ab5946': null,
    f0b0b8643: 'example2.com',
    websitepageviews: '7350',
    af03bf024: null
 }]

Обновление: я пробовал что-то вроде этого ... (Я не уверен, что нахожусь направильный путь на всех).

let obj1 = CRMobject;
let obj2 = ANALYTICSobject;
var count = Object.keys(CRMobject).length;
var newarray = [];
var i = 0;

Object.keys(obj1).forEach(function(partner){
    // if partner website found in analytics object...
    let newarray[i] = Object.assign({}, obj1, obj2.data.rows) //needs to be rows[something]
    i++;
});

1 Ответ

0 голосов
/ 26 сентября 2018

Вот пример того, что вы ищете.Я вижу, вы добавили некоторые вещи, которые вы пробовали, обычно полезно объяснить, где, по вашему мнению, проблема и почему то, что вы пробовали, не работает.Обратите внимание, что в приведенном ниже примере я использую некоторые расширенные функции, которые могут поддерживаться не во всех браузерах, например Object.values().Кроме того, вы захотите найти лучшее регулярное выражение, соответствующее вашему URL, я бы не советовал это делать в любом типе производственного кода, но он работает для примера.Регулярные выражения URL распространены в Интернете и гораздо более надежны, чем эта.

const crms = [{
    '0695dw9946': null,
    fc0b0dw9437: 'example1.com',
    adf03dw9241: null
  },
  {
    '095ab5946': null,
    f0b0b8643: 'example2.com',
    af03bf024: null
  }
];

const analytics = {
  data: {
    kind: 'analytics#gaData',
    id: 'https://www.googleapis.com/analytics/v3/data/ga?ids=ga:&dimensions=ga:sourceMedium&metrics=ga:pageviews&start-date=30daysAgo&end-date=today',
    query: {
      'start-date': '30daysAgo',
      'end-date': 'today',
      ids: 'ga:',
      dimensions: 'ga:sourceMedium',
      metrics: [Array],
      'start-index': 1,
      'max-results': 1000
    },
    totalsForAllResults: {
      'ga:pageviews': '7450'
    },
    rows: [
      ['example2.com / referral', '7350'], //pageviews from partner 2
      ['example1.com / referral', '100']
    ] //pageviews from partner 1
  }
};

const poorUrlRegex = /([http|https]:\/\/)?.*/;
const results = crms.map(crm => {
  const result = Object.assign({}, crm);
  result.websitepageviews = -1
  const vals = Object.values(crm).filter(v => !!v);
  const url = vals.find(v => !!v.match(poorUrlRegex));
  if (url) {
    const matchingRow = analytics.data.rows.find(r => r[0].indexOf(url) > -1);
    if (!!matchingRow) result.websitepageviews = parseInt(matchingRow[1], 10);
  }

  return result;
});
console.log(results);

Я назвал данные вашего примера и затем использовал Array.prototype.map для добавления просмотров страниц.Это выполняет операцию с каждым элементом массива и возвращает измененный элемент.Object.assign существует, чтобы не изменять существующие данные.Object.values работает так же, как Object.keys, но для значений.Я использую Array.prototype.find, чтобы найти URL-подобные значения, а затем пытаюсь найти подходящую строку в ваших аналитических данных.

Это также делает много предположений, как это только найдет одна совпадающая строка в ваших аналитических данных, если URL-адрес появляется более одного раза, он не будет добавлять просмотры страниц, возвращая только первое вхождение.Также отсутствует какой-либо тип обработки ошибок, но он вернет -1, если не найдет соответствующий URL в аналитике.

...