Я хочу добавить значение в массив, пытаюсь использовать splice, но оно хочет работать?

#javascript #arrays #splice #array-splice

#javascript #массивы #splice #array-splice

Вопрос:

У меня возникли проблемы с тем, чтобы заставить splice работать для my / 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, 0, home);
    console.log(home);
  }
};
urls();
console.log(result);  

и я подсчитал уникальные идентификаторы пользователей для каждого URL-адреса и количество посещений для каждого URL-адреса.

Итак, я получаю этот массив обратно, никакого соединения вообще ?!:

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

вот как я хотел бы, чтобы это выглядело:

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

  

Когда я извлекаю функцию splice из кода и пробую ее в codepen, она работает нормально …. но не в полном коде

Комментарии:

1. Ваш код не выдает такой результат. Я переместил ваш код во фрагмент, чтобы его можно было запустить. В нем нет сохраненных чисел result . Пожалуйста, убедитесь, что мы можем воспроизвести проблему, которую вы поднимаете.

Ответ №1:

На мой взгляд, это не лучший вариант для анализа данных журнала, но если вы хотите. Это решение

 

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

Ответ №2:

Это следующие шаги в решении —

  1. Пропустить строку заголовка по Array.prototype.slice
  2. Разделить на разделитель |
  3. Подсчитайте URL-ключ
  4. Накапливайте объект на основе ключа url
  5. Теперь после накопления подсчитайте количество накопленных записей, хранящихся в items.length и для разных идентификаторов пользователей используйте набор для его подсчета.
  6. Сгладьте структуру, используя Array.prototype.flat для достижения желаемого результата

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