2017-01-31 11 views
0

Статус:Получить конкретный ключ и значение из нескольких объектов

// WebdriverIO log function 

browser.log('browser').then(function(logs) { 
    console.log(logs.value); 
}); 

возвращает мне следующий массив:

[ { level: 'INFO', 
    message: 'https://localhost:3000/ 42:14 "foo"', 
    timestamp: 1485857149752 }, 
    { level: 'INFO', 
    message: 'https://localhost:3000/ 43:14 "bar"', 
    timestamp: 1485857149752 }, 
    { level: 'INFO', 
    message: 'https://localhost:3000/ 46:14 Array[6]', 
    timestamp: 1485857149755 }, 
    { level: 'SEVERE', 
    message: 'https://localhost:3000/favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)', 
    timestamp: 1485857149834 } ] 

Цель:

Я хочу, чтобы создать единый метод, который я могу использовать позже, который возвращает мне список записей журнала. Это было бы в этом случае с моим примером применением:

foo 
bar 

Я не знаю, как петля только ключ «сообщений» с его значением.

Чтобы фильтровать, чтобы получить только «foo» или «bar», я использовал бы функцию RegEx или .split.

+0

вы хотите отфильтровать, чтобы получить список только сообщений 's' например? – kukkuz

+0

['Array.prototype.map()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) – hindmost

+0

'Не удалось загрузить ресурс: сервер ответил со статусом 404 (Not Found) '- значение из последнего сообщения? – RomanPerekhrest

ответ

3

Вы можете сделать это с помощью Array.prototype.reduce():

let arr = [{ 
 
    level: 'INFO', 
 
    message: 'https://localhost:3000/ 42:14 "foo"', 
 
    timestamp: 1485857149752 
 
}, { 
 
    level: 'INFO', 
 
    message: 'https://localhost:3000/ 43:14 "bar"', 
 
    timestamp: 1485857149752 
 
}, { 
 
    level: 'INFO', 
 
    message: 'https://localhost:3000/ 46:14 Array[6]', 
 
    timestamp: 1485857149755 
 
}, { 
 
    level: 'SEVERE', 
 
    message: 'https://localhost:3000/favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)', 
 
    timestamp: 1485857149834 
 
}]; 
 

 
let res = arr.reduce((a, b) => { 
 
    if (b.level === 'INFO') { 
 
    a.push(b.message.split(" ").pop().replace(/"/g, "")); 
 
    } 
 
    return a; 
 
}, []); 
 

 
console.log(res);

Не забудьте осуществить проверку перед цепочки все

b.message.split(" ").pop().replace(/"/g, "") 

, чтобы избежать получения нулевых исключений указателя.

Sidenote:

Не был указан в ОП, но в случае, если сообщение, которое вы хотите собрать содержит пробелы слишком, вы можете заменить раскол выше и использовать @JLRishe's regex instead

+0

Это не работает, если какое-либо из сообщений содержит пробел. – JLRishe

+0

@JLRishe спасибо за головы, я добавил версию, которая охватывает этот случай. Кстати. ваш не работает ни для одного и того же случая. – baao

+0

Вы правы. Исправлено. – JLRishe

1

Вы можете сделать следующее:

var log = [ { level: 'INFO', 
 
    message: 'https://localhost:3000/ 42:14 "foo"', 
 
    timestamp: 1485857149752 }, 
 
    { level: 'INFO', 
 
    message: 'https://localhost:3000/ 43:14 "bar"', 
 
    timestamp: 1485857149752 }, 
 
    { level: 'INFO', 
 
    message: 'https://localhost:3000/ 46:14 Array[6]', 
 
    timestamp: 1485857149755 }, 
 
    { level: 'SEVERE', 
 
    message: 'https://localhost:3000/favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)', 
 
    timestamp: 1485857149834 } ] 
 

 
var messages = log 
 
    .filter(function (entry) { return entry.level === 'INFO'; }) 
 
    .map(function (entry) { 
 
     return entry.message.replace(/^([^\s]+\s){2}"?|"$/g, ''); 
 
    }); 
 

 
console.log(messages)

Это не превращает "foo" до foo и так далее, но неясно, как вы ожидаете, что код это сделает (я добавил комментарий к этому вопросу).