简体   繁体   中英

I want to add an value to an array, trying using splice, but it want work?

Im having problem with getting splice to work for my /home.

Im clearly doing something wrong but I cant figure out what, please help?

 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, 0, home); console.log(home); } }; urls(); console.log(result);

and I have counted the unique user ids on each url and no. of visits on each url.

So I get this array back, no splice at all?::

console.log("result:", result); //output ["/contact.html", "/home.html   ", 5, 4, 1, 1]

this is what I would like it to look like:

// dream scenario: ["/contact.html", 5, 4, "/home.html", 1, 1]

When I take the splice function out of the code and try it in codepen it works fine....but not in the fully code

In my opinion, this isn't the best variant to parse log data but if you want. That's solution



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))

These are the following steps in the solution -

  1. Skip header row by Array.prototype.slice
  2. Split by delimiter |
  3. Count the url key
  4. Accumulate the object based on the url key
  5. Now post accumulating, count the number of accumulated entries stored in items.length and for distinct userId(s) use a set to count it.
  6. Flatten the structure using Array.prototype.flat to meet your desired result

 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 |", "" ]; 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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM