问题:试图通过组合来自2个apis的输出对象,找出我们从每个合作伙伴那里获得了多少网站流量。
其思想是获取crm对象,从分析api对象(使用regex match example1.com.*)查找它们的网站pageview值,并将pageview属性和值添加到相应的crm对象。
这是一个node.js应用程序。
CRM API对象(来自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++;
});
发布于 2018-09-26 08:41:21
这是你正在寻找的东西的艰难之处。我看到你添加了一些你尝试过的东西,这通常有助于解释你认为问题出在哪里,以及为什么你尝试的东西不起作用。请注意,在下面的示例中,我使用了一些并非所有浏览器都支持的高级功能,如Object.values()
。此外,您可能希望找到一个更好的正则表达式来匹配您的URL,我不建议在任何类型的生产代码中这样做,但它适用于示例。URL regex在web上到处都是,而且比这个强大得多。
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。
https://stackoverflow.com/questions/52507406
复制相似问题