从多个对象中获取特定键和值

时间:2017-01-31 10:21:20

标签: javascript arrays unit-testing object webdriver-io

状态:

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

我不知道如何仅为“message”键循环其值。

要过滤以便仅获取“foo”或“bar”,我会使用RegEx或.split函数。

2 个答案:

答案 0 :(得分: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, "")

以避免获得空指针异常。

旁注:

未指定OP,但如果您要收集的邮件也包含空格,您可以替换上面的拆分并使用@JLRishe's regex instead

答案 1 :(得分: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等等,但目前尚不清楚您是如何期望代码执行此操作的(我已在您的问题中添加了对此的评论)