首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript根据正则表达式条件将键和值从一个对象添加到另一个对象

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

Stack Overflow用户
提问于 2018-09-26 06:22:13
回答 1查看 172关注 0票数 0

问题:试图通过组合来自2个apis的输出对象,找出我们从每个合作伙伴那里获得了多少网站流量。

其思想是获取crm对象,从分析api对象(使用regex match example1.com.*)查找它们的网站pageview值,并将pageview属性和值添加到相应的crm对象。

这是一个node.js应用程序。

CRM API对象(来自CRM的销售线索) api密钥/值

代码语言:javascript
复制
[ CollectionItem {
    '0695dw9946': null,
    fc0b0dw9437: 'example1.com',
    adf03dw9241: null
  CollectionItem {
    '095ab5946': null,
    f0b0b8643: 'example2.com',
    af03bf024: null
 }]

分析对象(网站浏览量流量ga:sourceMedium)

代码语言:javascript
复制
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
}}

所需的组合输出:

代码语言:javascript
复制
    [ CollectionItem {
    '0695dw9946': null,
    fc0b0dw9437: 'example1.com',
    websitepageviews: '100',
    adf03dw9241: null
  CollectionItem {
    '095ab5946': null,
    f0b0b8643: 'example2.com',
    websitepageviews: '7350',
    af03bf024: null
 }]

更新:我一直在尝试这样的事情……(我根本不确定我是否走在正确的道路上)。

代码语言:javascript
复制
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++;
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-26 08:41:21

这是你正在寻找的东西的艰难之处。我看到你添加了一些你尝试过的东西,这通常有助于解释你认为问题出在哪里,以及为什么你尝试的东西不起作用。请注意,在下面的示例中,我使用了一些并非所有浏览器都支持的高级功能,如Object.values()。此外,您可能希望找到一个更好的正则表达式来匹配您的URL,我不建议在任何类型的生产代码中这样做,但它适用于示例。URL regex在web上到处都是,而且比这个强大得多。

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52507406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档