【问题标题】:How To Use an Array to Pull Values from an Array of Objects如何使用数组从对象数组中提取值
【发布时间】:2019-08-13 14:43:27
【问题描述】:

密码验证失败的原因有很多:

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 返回相关消息以显示更连贯的错误消息。

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    对于failures中的每个值,从msg中拉取对应的项。 但是,我可以建议将msg 创建为字典吗?

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

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

    failures.forEach((failure) => {
      if (failure in msg) {
        console.log(msg[failure]);
      }
    });
    

    【讨论】:

    • 工作愉快。谢谢你:)
    【解决方案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']
    

    【讨论】:

      【解决方案3】:

      你可以使用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"]
      

      你从这里用它做什么取决于你,因为即使你加入消息数组,它也不会形成一个连贯的句子。我也同意上面的建议,即切换到Dict 之类的Object,而不是您现在使用的对象数组。

      【讨论】:

        【解决方案4】:

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

        我认为对于 cmets,这段代码是不言自明的。

        【讨论】:

          猜你喜欢
          • 2020-06-08
          • 2023-03-08
          • 1970-01-01
          • 2015-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多