计算淘汰赛js中observableArray中的重复项目

Count repeated items in an observableArray in knockout js

我有一个包含大约 540 条记录的 observableArray

在记录中它有一个广告 属性 和一个日期 属性 我想做一个函数来查找特定日期的所有广告并计算记录的数量例如

日期 = 23/02/2015

  1. 广告 1 (16)
  2. 广告 2 (5)
  3. 广告 3 (10)

总计 (31)

这应该可以帮助你相处,但基本上你可以有一个函数来遍历对象并创建一个计数数组:

self.counts = ko.observable();

function updateCounts() {
    var leads = self.leads(),
        counts = {};

    for (var i = 0, j = leads.length; i < j; i++) {
        var prop = leads[i].date_enquired();

        if (counts[prop] == null) {
            counts[prop] = {
                name  : prop,
                count : 1
            };
        }
        else {
            counts[prop].count++;
        }
    }

    // set it as an array instead of an object
    self.counts(Object.keys(counts).map(function (key) { return counts[key]; }));
}

运行 这个函数在开始时和列表更新时:

updateCounts();
self.leads.subscribe(updateCounts);

然后以您喜欢的任何方式在视图中显示对象:

<div data-bind="foreach: counts">
    <div data-bind="text: name + ': ' + count"></div>
</div>

JSFiddle

您还可以创建自己的对象来处理推送到数组和更新计数列表。这样每次添加或删除项目时,添加都是 O(1) 而不是 O(n)。总的来说,这没什么大不了的,因为迭代 500 多个项目真的很快。