我想为一个数组添加一个值,尝试使用splice,但是它想要工作吗?

问题描述

在为我的/ 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))
,

这些是解决方案中的以下步骤-

  1. Array.prototype.slice跳过标题行
  2. 由定界符|
  3. 分隔
  4. 计算网址键
  5. 根据url键累积对象
  6. 现在进行累积,对items.length中存储的累积条目数进行计数,对于不同的userId,请使用一个集合对其进行计数。
  7. 使用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);