【问题标题】:Get unique datetime string value from array of arrays in javascript从javascript中的数组数组中获取唯一的日期时间字符串值
【发布时间】:2017-11-23 17:23:34
【问题描述】:

我想遍历数组结构的数组,以过滤掉重复的日期时间字符串值,并将唯一的日期时间字符串值推送到新数组中排序。我尝试使用嵌套的forEach() 方法将每个当前键值与数组arr 中的所有键值进行比较,并在不匹配的情况下将它们推入res 数组中,但似乎不能正常工作。

这里是数组结构的数组

arr =[
   ["some_value", "2016-11-23 18:11", 1]
   ["some_value", "2016-11-23 18:01", 1]
   ["some_value", "2016-11-23 18:01", 2]
   ["some_value", "2016-11-23 18:01", 1]
   ["some_value", "2016-11-23 18:22", 1]
   ["some_value", "2016-11-23 18:23", 1]
   ["some_value", "2016-11-23 18:25", 1]
   ["some_value", "2016-11-23 18:24", 3]
   ["some_value", "2016-11-23 18:26", 1]
   ["some_value", "2016-11-23 18:27", 1]
];

我想要获得的结果

res = ["2016-11-23 18:01",
       "2016-11-23 18:11", 
       "2016-11-23 18:22",
       "2016-11-23 18:23",
       "2016-11-23 18:24",
       "2016-11-23 18:25",
       "2016-11-23 18:26",
       "2016-11-23 18:27"];

有人可以给我一些关于订单的提示以了解如何进行吗?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    我会将数组数组映射到日期字符串数组:

    arr = arrayOfArrays.map(x => x[1])
    

    然后,如果您将其转换为 set,您将获得唯一值

    var set = new Set(arr)
    

    如果需要,您最终可以将其转回数组

    var uniq = Array.from(set)
    

    用于排序

    uniq.sort((a,b)=> new Date(a) - new Date(b))
    

    var arrayOfArrays = [
       ["some_value", "2016-11-23 18:11", 1],
       ["some_value", "2016-11-23 18:01", 1],
       ["some_value", "2016-11-23 18:01", 2],
       ["some_value", "2016-11-23 18:01", 1],
       ["some_value", "2016-11-23 18:22", 1],
       ["some_value", "2016-11-23 18:23", 1],
       ["some_value", "2016-11-23 18:25", 1],
       ["some_value", "2016-11-23 18:24", 3],
       ["some_value", "2016-11-23 18:26", 1],
       ["some_value", "2016-11-23 18:27", 1],
    ];
    
    var arr = arrayOfArrays.map(x => x[1])
    var set = new Set(arr)
    
    var uniq = Array.from(set)
    
    uniq.sort((a,b)=> new Date(a) - new Date(b))
    
    console.log(uniq)

    【讨论】:

    • 在这种特定情况下,.sort() 方法中的ab 代表什么?因为在 moz 文档中,它指的是要比较的 2 个参数值。我曾尝试console.log 日期时间差异的结果,但我没有完全明白这一点。
    • a 和 b 代表数组的两个元素,如果函数返回小于 0 的东西 a 排在 b 之前,否则排在 b 之后
    • 很高兴我能帮上忙
    【解决方案2】:

    使用mapSet 的解决方案

    您可以映射数组以提取日期:

    const dates = arr.map(item => item[1]);
    

    然后您可以将它们放入 new Set 中,这是一个仅包含唯一项的数组。在创建的集合上调用.values 将返回其结果。

    arr = [
       ["some_value", "2016-11-23 18:11", 1],
       ["some_value", "2016-11-23 18:01", 1],
       ["some_value", "2016-11-23 18:01", 2],
       ["some_value", "2016-11-23 18:01", 1],
       ["some_value", "2016-11-23 18:22", 1],
       ["some_value", "2016-11-23 18:23", 1],
       ["some_value", "2016-11-23 18:25", 1],
       ["some_value", "2016-11-23 18:24", 3],
       ["some_value", "2016-11-23 18:26", 1],
       ["some_value", "2016-11-23 18:27", 1],
    ];
    
    
    const dates = arr.map(item => item[1]);
    const result = new Set(dates);
    
    console.log('result: ', Array.from(result))

    了解更多!

    您可以阅读有关集合的更多信息here on MDN

    这是一个更好地概念化“函数式”概念的图片map/filter/reduce 数组函数(过滤器是你省略洋葱的地方)

    图片来源:https://twitter.com/francesc/status/507942534388011008

    【讨论】:

      【解决方案3】:

      我只想用lodash的帮手来回答。我只是相信这仍然是相关的。

      var arr =[
          ["some_value", "2016-11-23 18:11", 1],
          ["some_value", "2016-11-23 18:01", 1],
          ["some_value", "2016-11-23 18:01", 2],
          ["some_value", "2016-11-23 18:01", 1],
          ["some_value", "2016-11-23 18:22", 1],
          ["some_value", "2016-11-23 18:23", 1],
          ["some_value", "2016-11-23 18:25", 1],
          ["some_value", "2016-11-23 18:24", 3],
          ["some_value", "2016-11-23 18:26", 1],
          ["some_value", "2016-11-23 18:27", 1]
      ];
      
      _.map(_.sortBy(_.uniqBy(arr, v => v[1]), v => v[1]), v => v[1]);
      

      【讨论】:

      • 有趣的图书馆..我会看看!谢谢
      【解决方案4】:
              var arr = arr = [
              ["some_value", "2016-11-23 18:11", 1],
              ["some_value", "2016-11-23 18:01", 1],
              ["some_value", "2016-11-23 18:01", 2],
              ["some_value", "2016-11-23 18:01", 1],
              ["some_value", "2016-11-23 18:22", 1],
              ["some_value", "2016-11-23 18:23", 1],
              ["some_value", "2016-11-23 18:25", 1],
              ["some_value", "2016-11-23 18:24", 3],
              ["some_value", "2016-11-23 18:26", 1],
              ["some_value", "2016-11-23 18:27", 1],
           ];
          var dates = arr.map(x => x[1])
          var uniqueArray = dates.filter(function (item, pos) {
              return dates.indexOf(item) == pos;
          });
      

      【讨论】:

        【解决方案5】:

        您可以尝试以下代码来获得所需的输出。

        function onlyUnique(value, index, self) { 
          return self.indexOf(value) === index;
        }
        
        var arr =[
          ["some_value", "2016-11-23 18:11", 1],
          ["some_value", "2016-11-23 18:01", 1],
          ["some_value", "2016-11-23 18:01", 2],
          ["some_value", "2016-11-23 18:01", 1],
          ["some_value", "2016-11-23 18:22", 1],
          ["some_value", "2016-11-23 18:23", 1],
          ["some_value", "2016-11-23 18:25", 1],
          ["some_value", "2016-11-23 18:24", 3],
          ["some_value", "2016-11-23 18:26", 1],
          ["some_value", "2016-11-23 18:27", 1]
        ];
        
        var rest = [];
        
        
        arr.forEach(function(entry) {
        
        rest.push(entry[1]) 
        });
        
        rest.sort();
        
        var finalArr = rest.filter( onlyUnique );
        
        console.log(finalArr);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-18
          • 2022-11-17
          • 1970-01-01
          • 2017-03-13
          • 2020-02-10
          相关资源
          最近更新 更多