将图表系列数组与新数组进行比较以确定添加/删除

时间:2014-02-09 22:01:17

标签: javascript arrays knockout.js highcharts

我正在为highcharts编写一个敲除绑定,因此我有一个可观察的高图series对象数组,我希望通过使用{{3}添加和/或删除系列来绑定到图表}。

以下是我的bindingHandler的大纲(对于那里的非淘汰,这是将我的ViewModel绑定到绑定到它的UI元素的位。)

ko.bindingHandlers.series = {
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        if(element.highChart === undefined){
            console.warn('Element ' + element.id + ' not attached to a highchart binding');
            return;
        }
        var value = valueAccessor();
        var valueUnwrapped = ko.unwrap(value);
        var chart = element.highChart;
        var series = chart.series;
        if($.isArray(valueUnwrapped)){
            // In here is my question
        }
    }
}

评论在上面形成了我的问题的关键。此时我有两个javascript变量

  • series - 当前显示的一系列highcharts系列对象
  • valueUnwrapped - 一系列highcharts系列对象,现在应该显示

比较这两个数组以确定

的有效方法是什么

如果有帮助,有一个有用的外观addSeries method,它会按ID获得一个系列,我很高兴在我的所有系列中都有一个id。这是在chart对象上,您将在上面的示例代码中看到它。

我当然可以非常懒惰并清除图表

while(series.length > 0)
     series[0].remove(false);

然后从我的数组中再次添加它们。我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

我认为,'懒惰'的方式并不是那么懒惰。即使你为每个系列的'id'设置,然后来自Highcharts的get()函数将循环遍历所有系列以找到一个。如果你有10个系列,那么你将进行10次循环。事实上,它还检查轴和点,因此它没有你想象的那么快。

我会坚持

while(series.length > 0)
   series[0].remove(false);

$(valueUnwrapped).each(function(el, in){
    chart.addSeries(el, false);
});

chart.redraw();

因为这就是全部:只有两个'for'循环具有良好的性能。在检查和比较是否需要删除或更新系列时,或者只是新数据集不值得(在我看来)。

我认为你可以尝试为knockout(没有highcharts标签)创建一个新的问题,例如:'如何基于ID'的os比较两个对象数组;)