Javascript根据正则表达式条件将键和值从一个对象添加到另一个

时间:2018-09-25 22:22:13

标签: javascript node.js object google-api

问题:尝试通过合并2个api的输出对象来找到我们从每个合作伙伴那里获得的网站访问量。

想法是获取crm对象,从Analytics api对象中查找其网站综合浏览量值(使用正则表达式匹配example1.com。*),并将pageview属性和值添加到相应的crm对象中。

这是一个node.js应用。

CRM API对象(来自CRM的领导) api键/值

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

Analytics对象(按访问量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 :(得分:0)

这里是您要寻找的内容的大致介绍。我看到您添加了一些您尝试过的方法,通常有助于解释您认为问题出在哪里以及为什么您尝试过的方法不起作用。请注意,在下面的示例中,我使用了某些并非所有浏览器都支持的高级功能,例如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