比较日期并创建计数javascript

时间:2015-01-09 17:38:55

标签: 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个条目。因此,我需要一种能够大幅缩短处理时间的方法。

2 个答案:

答案 0 :(得分:1)

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

首先,您可以减少代码:

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;

到内循环。

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

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

现在,count数组应该只有一种日期,没有傻瓜。

编辑后:

哇。 30000个条目。有30000个条目,方法必须是另一个。尝试这个解决方案,看看它是否适合你,但我相信它不适合你的情况。

答案 1 :(得分:0)

for(var i = 0; i < times.length-1; i++){
    for(var j = 0; j < times.length-1; i++){
        if((i!=j) && times[i] && times[j]){
            if(compare(times[i], times[j]) == true){
                console.log("same!!!");
            }else{
                console.log("not same!");
                count.push(times[i]);
            };
        };
    };
};