#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:
Это следующие шаги в решении —
- Пропустить строку заголовка по
Array.prototype.slice
- Разделить на разделитель
|
- Подсчитайте URL-ключ
- Накапливайте объект на основе ключа url
- Теперь после накопления подсчитайте количество накопленных записей, хранящихся в
items.length
и для разных идентификаторов пользователей используйте набор для его подсчета. - Сгладьте структуру, используя
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);