List.js 10.0 KB
Newer Older
L
lang 已提交
1 2
// TODO entry.getLon(), entry.getLat()
// List supported for cartesian, polar coordinateSystem
L
lang 已提交
3 4 5 6
define(function(require) {
    'use strict';

    var zrUtil = require('zrender/core/util');
L
lang 已提交
7
    var Model = require('../model/Model');
L
lang 已提交
8
    var DataDiffer = require('./DataDiffer');
L
lang 已提交
9 10 11 12 13 14 15 16

    function createArrayIterWithDepth(maxDepth, properties, cb, context, iterType) {
        // Simple optimization to avoid read the undefined value in properties array
        var nestedProperties = properties.length > 0;
        return function eachAxis(array, depth) {
            if (depth === maxDepth) {
                return zrUtil[iterType](array, cb, context);
            }
L
lang 已提交
17 18 19 20 21 22 23
            else if (array) {
                var property = properties[depth];
                for (var i = 0; i < array.length; i++) {
                    var item = array[i];
                    // Access property of each item
                    if (nestedProperties && property && item) {
                        item = item[property];
L
lang 已提交
24
                    }
L
lang 已提交
25
                    array[i] = eachAxis(item, depth);
L
lang 已提交
26 27 28 29
                }
            }
        }
    }
L
lang 已提交
30
    var dimensions = ['x', 'y', 'z', 'value', 'radius', 'angle']
L
lang 已提交
31 32 33
    /**
     * @name echarts/data/List~Entry
     * @extends {module:echarts/model/Model}
34 35 36 37 38 39
     *
     * @param {Object} option
     * @param {module:echarts/model/Model} parentModel
     * @param {number} dataIndex
     * @param {Array.<string>} [independentVar=['x']]
     * @param {Array.<string>} [dependentVar='y']
L
lang 已提交
40
     */
L
lang 已提交
41 42 43 44
    var Entry = Model.extend({

        layout: null,

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
        /**
         * @type {number}
         * @protected
         */
        xIndex: 0,

        /**
         * @type {number}
         * @protected
         */
        yIndex: 1,

        /**
         * @type {number}
         * @protected
         */
        zIndex: -1,

L
lang 已提交
63 64 65 66 67 68 69 70 71 72 73 74
        /**
         * @type {number}
         * @protected
         */
        radiusIndex: 0,

        /**
         * @type {number}
         * @protected
         */
        angleIndex: 1,

75 76 77 78 79
        /**
         * @type {number}
         * @protected
         */
        valueIndex: 1,
L
lang 已提交
80

81
        init: function (option, parentModel, dataIndex, independentVar, dependentVar) {
L
lang 已提交
82 83 84 85 86 87

            /**
             * @type {string}
             * @memeberOf module:echarts/data/List~Entry
             * @public
             */
L
lang 已提交
88 89
            this.name = option.name || '';

L
lang 已提交
90
            this.option = option;
L
lang 已提交
91

92 93 94 95 96 97
            var value = option.value == null ? option : option.value;

            if (typeof value === 'number') {
                value = [dataIndex, value];
            }

L
lang 已提交
98 99 100
            if (independentVar) {
                for (var i = 0; i < independentVar.length; i++) {
                    this[independentVar[i] + 'Index'] = i;
101 102 103
                }
                this.valueIndex = value.length - 1;

L
lang 已提交
104
                this[dependentVar + 'Index'] = this.valueIndex;
105 106
            }

L
lang 已提交
107
            /**
108
             * @type {Array.<number>}
L
lang 已提交
109 110 111
             * @memeberOf module:echarts/data/List~Entry
             * @private
             */
112
            this._value = value;
L
lang 已提交
113

L
lang 已提交
114 115 116 117
            /**
             * @private
             * @readOnly
             */
118
            this.dataIndex = dataIndex;
L
lang 已提交
119 120 121 122 123
        },

        /**
         * @return {number}
         */
124 125 126 127
        getStackedValue: function () {
            if (this.dimension !== 1) {
                // Only 1d value support stack
                return this.getValue();
L
lang 已提交
128
            }
L
lang 已提交
129 130 131 132 133 134
        },

        clone: function () {
            var entry = new Entry(
                this.option, this.parentModel, this.dataIndex
            );
L
lang 已提交
135
            entry.name = this.name;
L
lang 已提交
136 137 138 139 140

            for (var i = 0; i < dimensions.length; i++) {
                var key = dimensions[i] + 'Index';
                entry[key] = this[key];
            }
L
lang 已提交
141
            return entry;
L
lang 已提交
142 143 144
        }
    });

L
lang 已提交
145
    zrUtil.each(dimensions, function (dim) {
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
        var capitalized = dim[0].toUpperCase() + dim.substr(1);
        var indexKey = dim + 'Index';
        Entry.prototype['get' + capitalized] = function () {
            var index = this[indexKey];
            if (index >= 0) {
                return this._value[index];
            }
        }
        Entry.prototype['set' + capitalized] = function (val) {
            var index = this[indexKey];
            if (index >= 0) {
                this._value[indexKey] = val;
            }
        }
    });
L
lang 已提交
161

162
    function List() {
L
lang 已提交
163
        this.elements = [];
L
lang 已提交
164 165 166 167 168 169
    }

    List.prototype = {

        constructor: List,

L
lang 已提交
170 171
        type: 'list',

L
lang 已提交
172 173
        each: function (cb, context) {
            context = context || this;
174
            zrUtil.each(this.elements, cb, context);
L
lang 已提交
175 176
        },

L
lang 已提交
177 178
        /**
         * Data mapping, returned array is flatten
179
         * PENDING
L
lang 已提交
180 181 182 183 184 185 186 187 188
         */
        map: function (cb, context) {
            var ret = [];
            this.each(function (item, idx) {
                ret.push(cb && cb.call(context || this, item));
            }, context);
            return ret;
        },

189 190
        filter: function (cb, context) {
            var list = new List();
L
lang 已提交
191
            context = context || this;
192
            list.elements = zrUtil.filter(this.elements, cb, context);
L
lang 已提交
193 194
        },

L
lang 已提交
195 196 197 198 199 200 201 202 203 204 205
        /**
         * @return {module:echarts/data/List~Entry}
         */
        getByName: function (name) {
            // TODO deep hierarchy
            var elements = this.elements;
            for (var i = 0; i < elements.length; i++) {
                if (elements[i].name === name) {
                    return elements[i];
                }
            }
L
lang 已提交
206 207
        },

L
lang 已提交
208 209 210 211 212 213 214 215 216 217 218 219
        /**
         * @param {string} name
         * @param {*} option
         */
        append: function (name, option) {
            var elements = this.elements;
            var el = new Entry(option, null, elements.length);
            el.name = name;
            elements.push(el);
            return el;
        },

L
lang 已提交
220 221 222 223
        diff: function (oldList) {
            return new DataDiffer(oldList ? oldList.elements : [], this.elements);
        },

L
lang 已提交
224
        clone: function () {
L
lang 已提交
225 226 227 228 229 230 231 232
            var list = new List();
            var elements = this.elements;
            for (var i = 0; i < elements.length; i++) {
                list.elements.push(elements[i].clone());
            }
            list.depth = this.depth;
            list.properties = this.properties;
            return list;
L
lang 已提交
233 234 235
        }
    };

L
lang 已提交
236
    zrUtil.each(['X', 'Y', 'Z', 'Value'], function (name) {
L
lang 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249
        List.prototype['each' + name] = function (cb, context) {
            this.each(function (item, idx) {
                cb && cb.call(context || this, item['get' + name](idx));
            }, context);
        };

        List.prototype['map' + name] = function (cb, context) {
            var ret = [];
            this.each(function (item) {
                ret.push(cb && cb.call(context || this, item['get' + name]()));
            }, context);
            return ret;
        };
250 251 252 253 254 255 256 257 258 259 260 261

        List.prototype['filter' + name] = function (cb, context) {
            var newList = this.clone();
            var elements = []
            newList.each(function (item) {
                if (cb.call(context || newList, item['get' + name]())) {
                    elements.push(item);
                }
            }, context);
            newList.elements = elements;
            return newList;
        };
L
lang 已提交
262 263
    });

264
    List.fromArray = function (data, seriesModel, ecModel) {
L
lang 已提交
265
        var coordinateSystem = seriesModel.get('coordinateSystem');
266 267 268
        var independentVar;
        var dependentVar;

L
lang 已提交
269 270 271 272 273 274
        // FIXME
        // 这里 List 跟几个坐标系和坐标系 Model 耦合了
        if (coordinateSystem === 'cartesian2d') {
            var xAxisModel = ecModel.getComponent('xAxis', seriesModel.get('xAxisIndex'));
            var yAxisModel = ecModel.getComponent('yAxis', seriesModel.get('yAxisIndex'));
            if (xAxisModel.get('type') === 'category') {
L
lang 已提交
275 276 277
                independentVar = ['x'];
                dependentVar = 'y';
            }
L
lang 已提交
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
            else if (yAxisModel.get('type') === 'category') {
                independentVar = ['y'];
                dependentVar = 'x';
            }
            else {
                // PENDING
                var dim = data[0] && data[0].length;
                if (dim === 2) {
                    independentVar = ['x'];
                    dependentVar = 'y';
                }
                else if (dim === 3) {
                    independentVar = ['x', 'y'];
                    dependentVar = 'z';
                }
            }
        }
        else if (coordinateSystem === 'polar') {
            function axisFinder(axisModel) {
                return axisModel.get('polarIndex') === polarIndex;
            };
            var polarIndex = seriesModel.get('polarIndex') || 0;
            var angleAxisModel = ecModel.findComponent('angleAxis', axisFinder);
            var radiusAxisModel = ecModel.findComponent('radiusAxis', axisFinder);

            if (angleAxisModel.get('type') === 'category') {
                independentVar = ['angle'];
                dependentVar = 'radius';
            }
            else if (radiusAxisModel.get('type') === 'category') {
                independentVar = ['radius'];
                dependentVar = 'angle';
            }
            else {
                var dim = data[0] && data[0].length;
                if (dim === 2) {
                    independentVar = ['radius'];
                    dependentVar = 'angle';
                }
                else if (dim === 3) {
                    independentVar = ['radius', 'angle'];
                    dependentVar = 'value';
                }
L
lang 已提交
321 322
            }
        }
323

L
lang 已提交
324
        var list = new List();
325

L
lang 已提交
326
        // Normalize data
L
lang 已提交
327
        list.elements = zrUtil.map(data, function (dataItem, index) {
328
            var entry = new Entry(dataItem, seriesModel, index, independentVar, dependentVar);
L
lang 已提交
329
            // FIXME
L
lang 已提交
330 331 332
            if (! dataItem.name) {
                entry.name = index;
            }
L
lang 已提交
333
            return entry;
L
lang 已提交
334 335
        });
        return list;
L
lang 已提交
336 337 338
    };

    List.Entry = Entry;
L
lang 已提交
339 340 341

    return List;
});