问题描述
在为我的/ home工作时遇到了问题。
我显然做错了什么,但我不知道该怎么办,请帮忙?
const logArray = [
"|timestamp |url |userid|","|2019-03-01 09:00:00UTC |/contact.html |12345 |","|2019-03-01 09:00:00UTC |/contact.html |12346 |","|2019-03-01 10:00:00UTC |/contact.html |12345 |","|2019-03-01 10:30:00UTC |/home.html |12347 |","|2019-03-01 11:00:00UTC |/contact.html |12347 |","|2019-03-02 11:00:00UTC |/contact.html |12348 |","|2019-03-02 12:00:00UTC |/home.html |12348 |","|2019-03-03 13:00:00UTC |/home.html |12349 |",""
];
let result = [];
const urls = () => {
const url = logArray.map((Objects,index,arr) => {
return Objects.slice(25,38);
});
console.log("url:",url);
if (url) {
const contact = url.find((a) => a.includes("contact"));
result.push(contact);
console.log(contact);
//console.log(contact)
}
if (url) {
const home = url.find((a) => a.includes("home"));
result.splice(3,home);
console.log(home);
}
};
urls();
console.log(result);
,我已经计算出每个网址的唯一用户ID,没有。每个网址的访问次数。
所以我把这个阵列取回来,根本没有接头?!:
console.log("result:",result); //output ["/contact.html","/home.html ",5,4,1,1]
这就是我想要的样子:
// dream scenario: ["/contact.html","/home.html",1]
当我从代码中删除拼接函数并在codepen中尝试时,它可以正常工作....但是在完整代码中却不行
解决方法
我认为,这不是解析日志数据的最佳方法,但是如果需要的话。那是解决方案
const logArray = [
"|timestamp |url |userid|","|2019-03-01 09:00:00UTC |/contact.html |12345 |","|2019-03-01 09:00:00UTC |/contact.html |12346 |","|2019-03-01 10:00:00UTC |/contact.html |12345 |","|2019-03-01 10:30:00UTC |/home.html |12347 |","|2019-03-01 11:00:00UTC |/contact.html |12347 |","|2019-03-02 11:00:00UTC |/contact.html |12348 |","|2019-03-02 12:00:00UTC |/home.html |12348 |","|2019-03-03 13:00:00UTC |/home.html |12349 |",""
];
function getDataFromLogs(logs) {
const formattedLogs = logs.slice(1,logs.length - 1)
const urls = {}
formattedLogs.map(log => {
const route = log.slice(25,38);
const userID = log.slice(40,46);
if (urls[route] === undefined) {
urls[route] = []
}
urls[route].push(userID)
})
const results = [];
Object.keys(urls).map(key => {
const data = urls[key];
results.push(key.trim(),data.length,[...new Set(data)].length);
})
return results;
}
// ["/contact.html",5,4,"/home.html",3,3]
console.log(getDataFromLogs(logArray))
,
这些是解决方案中的以下步骤-
- 按
Array.prototype.slice
跳过标题行 - 由定界符
|
分隔
- 计算网址键
- 根据url键累积对象
- 现在进行累积,对
items.length
中存储的累积条目数进行计数,对于不同的userId,请使用一个集合对其进行计数。 - 使用
Array.prototype.flat
展开结构以达到您想要的结果
const logArray = [
"|timestamp |url |userid|",""
];
const result = Object.entries(logArray
.slice(1)
.reduce((acc,curr) => {
if (curr) {
let [,url,userId] = curr.trim().split('|');
url = url.trim();
userId = userId.trim();
acc[url] = (acc[url] || []).concat({
url,userId
});
}
return acc;
},Object.create(null)))
.reduce((r,c) => {
const [key,items] = c;
const distinctItemCount = new Set(items.map(x => x.userId)).size;
r.push([key,items.length,distinctItemCount]);
return r;
},[])
.flat();
console.log(result);