New data driver - metajsArray

Здравствуйте.

Хочу предложить простой, но эффективный метод передачи данных для различных webix компонентов. Данные передаются как массив массивов элементов и данные о названии полей и их типах.
Преимущества:
1. Уменьшение объема передаваемых данных и соответственно времени
которое ожидает пользователь;
2. Управлении типами - можно задать тип каждого элемента, что намного упрощает дальнейшую работу внутри компонентов;
3. Передача имен параметров с сервера, а не произвольных как jsarray (data1 .. dataN);
4. Для компонент webix которые изначально были сделаны для работы с json ничего не меняется (не надо писать схемы, делать map`ы)

Примерная экономия на больших наборах данных - более 2х раз по сравнению с передачей данных чисто в json формате;

Метод может быть полезен при передачи больших объемов информации, например статистика, данные для графиков или аналитического куба.

Данный драйвер ожидает на входе json вида:

{ data: [
    ["1","Apple"],
    ["2","Fish"],
    ...
  ],
  meta: [
    {name:"id", type:"int"},
    "value"
  ]
}

где:
data: это массив в каждом элементе - массив со значениями
meta: массив описания данных, в каждом элементе либо строка с именем, либо объект с двумя свойствами name и type.
type может быть: str, int, date, float, unixtime

Преобразуется во что то типа:
[
    {id:1,value:"Apple"},
    {id:2,value:"Fish"},
    ...
]

Как использовать:
https://snippet.webix.com/5dj00exo

Код:

webix.DataDriver.metajsArray = webix.extend({
    getRecords:function(data){
        let meta;
        if (data && data.meta)
            meta = data.meta;
        if (data && data.data)
            data = data.data;

        if (meta && Array.isArray(meta) && Array.isArray(data) ){
            // transform data array of array to array of object
            data.forEach(function(item, index, array) {
                let i;
                let res = {};
                let mtype;
                for (i = 0; i < this.length; i++) {
                    let m = this[i]
                    if (typeof m == "string")
                        res[m] = item[i]
                    else if (typeof m == "object" && m.name){
                        if (m.hasOwnProperty('type'))
                            mtype=m.type.toLowerCase();
                        else
                            mtype = 'str';

                        if (mtype == 'int')
                            res[m.name] = parseInt(item[i]);
                        else if (mtype == 'float')
                            res[m.name] = parseFloat(item[i]);
                        else if (mtype == 'date')
                            res[m.name] = new Date(item[i].replace("T", " "));
                        else if (mtype == 'unixtime')
                            res[m.name] = new Date(parseInt(item[i]) * 1000);
                        else
                            res[m.name] = item[i];
                    }
                }
                array[index] = res;
            },meta);
        }
        return data;
    },
}, webix.DataDriver.json);

Все кому понравится - пользуйтесь без ограничений. Если включите в состав webix я только порадуюсь)

Tagged:

Comments

  • edited November 2020

    Здравствуйте, @IL_S !

    Все кому понравится - пользуйтесь без ограничений. Если включите в состав webix я только порадуюсь)

    Спасибо вам за предложенное решение и пример! Думаю, что мы добавим эту возможность в следующих обновлениях.

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

In this Discussion