【问题标题】:How can I detect if array have year value and define it?如何检测数组是否具有年份值并定义它?
【发布时间】:2019-03-25 05:28:34
【问题描述】:

这里是示例数组:

[ 'test', '1994', 'test', 'test', '2018']

我需要的是示例数组中的 2 个数组:

[ 'test', 'test', 'test' ]

[ '1994', '2018' ]

我尝试使用indexOf,但接缝我无法通过所有可能年份值的数组(~1900-present/2018)

我知道switch statment 会起作用,但它需要大量复制粘贴代码,我相信有更好的方法来做到这一点。

编辑:

你们中的一些人不明白我想要得到什么year值而不仅仅是一个数字,所以用正则表达式回答最接近我想要的,我只是谷歌搜索到^(19|20)\d{2}$ 后替换正则表达式。所以年份可能只有 1900-2099 年。

【问题讨论】:

    标签: javascript arrays node.js


    【解决方案1】:

    您可以将数组缩减为 2 个单独的数组。检查字符串是否可以转换为 1900-2018 范围内的数字,以及它的计算结果是否为:

    1. false - 强制转换为 0,并推送到第一个子数组
    2. true - 转换为 1,并推送到第二个子数组

    那么就可以通过数组解构得到这两个数组了。

    const arr = ['test', '1994', 'test', 'test', '2018'];
    
    const isYear = (n) => n >= 1900 && n <= 2018;
    
    const [test, years] = arr.reduce((r, s) => {
      r[+isYear(+s)].push(s);
      
      return r;
    }, [[], []]);
    
    console.log(test);
    
    console.log(years);

    【讨论】:

      【解决方案2】:

      您可以检查isNaN 并将值推送到任一数字或文本数组。

      var array = ['test', '1994', 'test', 'test', '2018'],
          text = [],
          numbers = [];
      
      array.forEach(s => [numbers, text][+/^(19|20)\d{2}$/.test(s)].push(s));
          
      console.log(text);
      console.log(numbers);

      【讨论】:

      • @Ele,你指的是哪一部分?
      • 它是一个具有数值的属性访问器,使用一元plusisNaN的检查布尔结果。
      • 聪明的解决方案。我喜欢!
      • 切割器和短但不完全是我想要的,阅读帖子编辑。
      • 你可以用正则表达式代替isNaN
      【解决方案3】:

      您还可以使用filterisNaN 检查来完成此操作。

      var array = ['test', '1994', 'test', 'test', '2018'];
      
      var text = array.filter(e => isNaN(e)),
          years = array.filter(e => !isNaN(e));
          
      console.log(text);
      console.log(years);

      【讨论】:

        【解决方案4】:

        您可以使用函数reduce根据字符串的内容对字符串进行分组。

        let arr = [ 'test', '1994', 'test', 'test', '2018'],
            isYear = (s) => !isNaN(Number(s.trim())),
            result = arr.reduce((a, s) => {
              if (isYear(s)) a.years.push(s);
              else a.strings.push(s);
              return a;
            } , {years: [], strings: []});
        
        console.log(result);
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

          【解决方案5】:

          您可以使用正则表达式来执行此操作:

          var arr = [ 'test', '1994', 'test', 'test', '2018'];
          var dates = [];
          var nonDates = [];
          for (var i = 0; i < arr.length; i++) {
              if (arr[i].match(/^\d{4}$/))
                  dates.push(arr[i]);
              else
                  nonDates.push(arr[i]);
          }
          

          【讨论】:

          • 谢谢,这正是我想要的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-14
          • 2018-07-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多