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

时间:2015-03-05 15:25:56

标签: arrays knockout.js

我有一个带有约540条记录的observableArray

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

日期= 23/02/2015

  1. 广告1(16)
  2. 广告2(5)
  3. 广告3(10)
  4. 总计(31)

1 个答案:

答案 0 :(得分:0)

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

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多个项目真的很快。