如何使用数组从对象数组中提取值

时间:2019-08-13 14:43:27

标签: javascript arrays object ecmascript-6

我有多种原因导致密码验证失败:

const failures = schema.validate(password.value, { list: true });
console.log(failues);
// => [ 'min', 'uppercase', 'digits' ]

我也有一个对象数组。 key始终是failures数组的潜在值:

const msg = [
  { key: 'min', message: 'minimum' },
  { key: 'max', message: 'maximum' },
  { key: 'uppercase', message: 'need a uppercase' },
  { key: 'lowercase', message: 'need a lowercase' },
  { key: 'digits', message: 'must have digits' },
  { key: 'spaces', message: 'no spaces' },
  { key: 'oneOf', message: 'is not one of' },
];

我想映射到failures数组并从msg返回相关消息以显示更连贯的错误消息。

4 个答案:

答案 0 :(得分:2)

对于verse:version_number中的每个值,从failures中拉出相应的项目。 但是,我是否建议将msg创建为字典?

msg

这将使执行此操作更加容易。

const msg = {
  'min': 'minimum',
  'max': 'maximum',
  ...
};

答案 1 :(得分:2)

const failures = schema.validate(password.value, { list: true });
console.log(failures);
// => [ 'min', 'uppercase', 'digits' ]

const msg = [
  { key: 'min', message: 'minimum' },
  { key: 'max', message: 'maximum' },
  { key: 'uppercase', message: 'need a uppercase' },
  { key: 'lowercase', message: 'need a lowercase' },
  { key: 'digits', message: 'must have digits' },
  { key: 'spaces', message: 'no spaces' },
  { key: 'oneOf', message: 'is not one of' },
];

const listOfMessages = msgs
  .filter(msg => failures.includes(msg.key)) // Get the appropriate object matching the error
  .map(msg => msg.message) // Only get the message

console.log(listOfMessages) // ['minimum', 'need a uppercase', 'must have digits']

答案 2 :(得分:1)

您可以使用array.filter() and array.map()来实现所需的目标:

const messages = msg.filter(r=>failures.indexOf(r.key)!==-1).map(r=>r.message)// ["minimum", "need a uppercase", "must have digits"]

您可以根据自己的意愿来进行处理,即使您加入messages数组,也不会形成连贯的句子。我也同意上面的建议,改用Dict之类的Object而不是您现在使用的对象数组。

答案 3 :(得分:0)

// this is a very verbose way to store this information, also hard to fetch by key
const msg = [
  { key: 'min', message: 'minimum' },
  { key: 'max', message: 'maximum' },
  { key: 'uppercase', message: 'need a uppercase' },
  { key: 'lowercase', message: 'need a lowercase' },
  { key: 'digits', message: 'must have digits' },
  { key: 'spaces', message: 'no spaces' },
  { key: 'oneOf', message: 'is not one of' },
];

const failures = [
  'min',
  'uppercase',
  'digits',
  'something-not-mapped'
];


// better use a map
const msg2 = msg.reduce((acc, item) => {
  acc[item.key] = item.message;
  return acc;
}, {});
console.log("msg2:", msg2);

// now you can do:
console.log("mapped failures:", failures.map(key => msg2[key] || key));
.as-console-wrapper{top:0;max-height:100%!important}

我认为带有注释的代码是不言自明的。