javascript - 比较日期并创建计数 javascript

标签 javascript arrays count duplicates

我正在尝试比较一个数组中以“Y-M-D H-i-s”格式存储的日期,希望删除重复项并在原始日期旁边创建一个计数,我使用以下代码比较日期:

function compare(a, b){
            if(a.getDate() == b.getDate() && a.getMonth() == b.getMonth() && a.getFullYear() == b.getFullYear()){
                return true;
            }else{
                return false;
            };
        };

这就是我循环它们的方式:

    times.forEach(function(timeOne){
        times.forEach(function(timeTwo){
            if(compare(timeOne, timeTwo)){
                console.log("same");
            }else{
                console.log("different");
                count.push(timeOne);
            };
        });
    });

当我这样做时,它似乎不起作用,只是删除了前 1619 个值,它不会推送到计数数组并导致我的浏览器崩溃。关于如何克服这个问题或实现我所需要的更好方法的任何建议。我目前也不确定如何同时创建计数。

编辑---

以下是该程序的剩余代码:

var results = <?php echo $results; ?>,                                                                                                                 
            times = [],                                                                                                                                        
            count = [];
     results.forEach(function(result){                                                                                                                      
         times.push(new Date(result.time));                                                                                                                 
     });

我还想提一下,items 数组接近 30,000 个条目。因此,我需要一种能够大幅减少处理时间的方法。

最佳答案

我会给一些提示。也许他们会解决您的问题。

首先,您可以减少代码:

function compare(a, b){
    if(a.getDate() == b.getDate() && a.getMonth() == b.getMonth() && a.getFullYear() == b.getFullYear()){
        return true;
    }else{
        return false;
    };
};

function compare(a, b){
    return a.getDate() == b.getDate() && a.getMonth() == b.getMonth() && a.getFullYear() == b.getFullYear();
};

其次,你的循环是错误的。 内部循环正在循环 i 变量而不是 j:

for(var j = 0; j < times.length-1; i++){
        ...
};

第三,由于您试图删除重复项,因此您应该跳过 i == j 的元素,因为它们始终相等。所以添加:

if(i == j) continue;

到内循环。

第四,你的做法是错误的。如果某个元素与其他元素不同,则将推送到计数数组。这并不能保证没有重复。看,如果你有一个带有 [1, 2, 2, 3, 4] 的数组,并尝试使用你的算法删除重复项,结果数组将像这样 [1, 1, 1, 1, 2, 2, 2、3、3、3、3、4、4、4、4]。这是因为您正在按元素搜索欺骗,但您应该按数组搜索它。您的算法必须保证数组中只有一种。正确的循环是:

for(var i = 0; i < times.length; i++){
    if(times[i] == null || times[i] == undefined) continue;
    if(!contains(count, times[i])){
        count.push(times[i]);
    }
}

function contains(arr, elm){
    for(var i = 0; i < arr.length; i++){
        if(compare(elm, arr[i]))
            return true;
    }
    return false;
}

计数数组现在每个日期应该只有一种,没有重复。

编辑后:

哇。 30000 个条目。对于 30000 个条目,必须采用另一种方法。尝试这个解决方案,看看它是否能解决您的问题,但我相信它不适合您的情况。

关于javascript - 比较日期并创建计数 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27866138/

相关文章:

c - 将二维数组传递给函数

java - 一些消息已经简化。用-Xdiags :verbose to get full output?重新编译

php - 选择特定的重复数据库值并显示计数

javascript - 是否可以使用 AJAX 上传文件而不使用 iframe 或 Flash?

javascript - 如何仅监听 javascript/jquery 上的第一个滚动事件?

javascript - 在这个 plunkr 中,为什么 ng-model 不更新?

r - 计算 R 中数据帧行中特定单词的出现次数

javascript - 在 Javascript 中制作函数式 OO 函数

ios - 显示来自对象的 TableView 行 - iOS Swift

mysql - 连接两个表并获取一个表的计数,但所有结果都与另一个表上的 ID 匹配