DataCollection.js, 轻松操作来自API响应的数据

分享于 

21分钟阅读

GitHub

  繁體 雙語
Manipulate large, in-memory datasets with ease using JavaScript.
  • 源代码名称:DataCollection.js
  • 源代码网址:http://www.github.com/thestorefront/DataCollection.js
  • DataCollection.js源代码文档
  • DataCollection.js源代码下载
  • Git URL:
    git://www.github.com/thestorefront/DataCollection.js.git
    Git Clone代码到本地:
    git clone http://www.github.com/thestorefront/DataCollection.js
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/thestorefront/DataCollection.js
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    DataCollection.js 'coverage'

    轻松操作来自API响应的数据。

    由于现代对象关系管理器的灵感,DataCollection.js 是一个用于存储。过滤。操作和加入大数据集。 对于使用 rest API端点返回的数据来说非常理想。

    为了使大型(> 10,000 ) 记录集接近本机 array 操作的同步性能,让 DataCollection.js 为你做你的繁重提升。

    安装

    通过嵌入以下脚本( 假定已经将它的放在 root 目录中),可以开始使用 DataCollection.js

    网络

    <scriptsrc="/data_collection-1.1.6.js"></script>

    此外,可以在以下位置找到缩小版本

    <scriptsrc="/data_collection-1.1.6-min.js"></script>

    然后,你可以开始使用 DataCollection 对象

    var dc =newDataCollection();

    node

    $ npm install data-collection

    接着是一个需要该脚本的脚本。

    var DataCollection =require('data-collection');

    Woohoo !

    示例

    DataCollection可以用于快速。同步处理大型数据集( 对象数组) - 换句话说,一个 RESTful API响应。

    它对于维护特定键的映射和索引结果尤其有用。

    假设我有一个标准 array,它包含了rest式API响应的结果。 我的数据集如下所示:

    var characters = [
     {
     id:1,
     first_name:'Jon',
     last_name:'Snow',
     gender:'m',
     age:14,
     location:'Winterfell' },
     {
     id:2,
     first_name:'Eddard',
     last_name:'Stark',
     gender:'m',
     age:35,
     location:'Winterfell' },
     {
     id:3,
     first_name:'Catelyn',
     last_name:'Stark',
     gender:'f',
     age:33,
     location:'Winterfell' },
     {
     id:4,
     first_name:'Roose',
     last_name:'Bolton',
     gender:'m',
     age:40,
     location:'Dreadfort' },
     {
     id:5,
     first_name:'Ramsay',
     last_name:'Snow',
     gender:'m',
     age:15,
     location:'Dreadfort' }
    ];

    首先,让我们把这些数据加载到 DataCollection

    var charDC =newDataCollection(characters);

    现在,让我们来解决一些问题。

    我怎么找到北方的杂种?

    filter 允许我们查找特定的值。

    var bastards =charDC.query().filter({last_name:'Snow'}).values();

    我怎么知道最高的年龄?

    一个简单的max() 调用可以实现。

    var topAge =charDC.query().max('age');

    我怎么找到所有唯一的位置?

    DataCollection提供了一个易于使用的distinct 函数。

    基于
    var locations =charDC.query().distinct('location');

    如果我想永久删除Catelyn和 Eddard,那又该怎么办?

    ( 为什么 不 呢?

    基于
    charDC.query().filter({first_name__in: ['Catelyn', 'Eddard']}).remove();

    更多示例

    // Will return Jon, Eddard and RamsaycharDC.query()
    . filter({gender:'m', age__lt:40})
    . values();// Updates locationcharDC.query()
    . filter({location:'Winterfell'})
    . exclude({first_name:'Jon'})
    . update({location:'King's Landing'});// Finds Roose, RamsaychardDC.query()
    . filter({first_name__contains:'R'});// Finds Roose, Ramsay, Eddard --- case insensitivecharDC.query()
    . filter({first_name__icontains:'R'})
    . values();// Creates a mapping for current future values...charDC.createMapping('is_bastard', function(row) {
     returnrow.last_name==='Snow';
    });// truecharDC.query().filter({first_name:'Jon'}).first().is_bastard;// falsecharDC.query().filter({first_name:'Catelyn'}).first().is_bastard;// Add an entry (Can accept each entry as an argument, or an array)charDC.insert({
     id:6,
     first_name:'Rob',
     last_name:'Stark',
     gender:'m',
     age:14,
     location:'Winterfell'});// new entry, but is also falsecharDC.query().filter({first_name:'Rob'}).first().is_bastard;// will return Eddard and Catelyn rowscharDC.query()
    . sort('age', true) // sortDesc = true. limit(1, 2)
    . values();

    嵌套对象

    如果我的任务对象有对象 inside? 我可以按这些字段过滤和排序?

    当然用双下划线( __ ) 分隔嵌套的字段。

    请注意,在使用这里方法时,必须检查使用 '__is'的确切值。

    var dc =newDataCollection();dc.load([{
     main: {
     sub:7,
     sub2: {
     low:8 }
     }
    }, {
     main: {
     sub:7,
     sub2: {
     low:20 }
     }
    }, {
     main: {
     sub:-1,
     sub2: {
     low:16 }
     }
    }]);// Returns only first two rowsdc.query().filter({main__sub__is:7}).values();// Returns only last two rowsdc.query().filter({main__sub__low__gte:10}).values();

    还有更多试试。

    文档

    DataCollection对象

    基于
    
    DataCollection( [Optional Array] data )
    
    
    
    

    构造函数( 与 new 关键字一起使用)

    如果提供了数据,将运行 DataCollection.prototype.load(data)

    方法

    DataCollection.prototype.defineIndex
    
    defineIndex( [String] key )
    
    
     returns self
    
    
    
    

    定义用于这里 Collection的索引,作为用于 DataCollection.prototype.existsDataCollection.prototype.fetchDataCollection.prototype.destroy的索引的索引

    所有索引值都将转换为字符串,注意唯一性

    DataCollection.prototype.createMapping
    
    createMapping( [String] key, [Function] map -> ([Object] row) )
    
    
     returns self
    
    
    
    

    定义映射键,以及根据输入行返回关联值的函数。 可以随时使用,新的映射将立即应用到你的DataCollection。

    示例:
    var dc =newDataCollection();dc.createMapping('c', function(row) { return row['a'] + row['b']; });dc.load([{a:1, b:2}, {a:2, b:3}]);console.log(dc.query().last()); // logs {a: 2, b: 3, c: 5}
    DataCollection.prototype.exists
    
    exists( [String] indexedValue )
    
    
     returns boolean
    
    
    
    

    确定DataCollection是否根据索引键具有指定索引的条目

    DataCollection.prototype.fetch
    
    fetch( [String] indexedValue )
    
    
     returns Object
    
    
    
    

    根据索引键获取与指定索引关联的对象( 如果存在)。 否则,返回 null

    DataCollection.prototype.destroy
    
    destroy( [String] indexedValue )
    
    
     returns true
    
    
    
    

    根据索引键销毁与指定索引关联的对象( 如果存在)。 否则,抛出错误。

    DataCollection.prototype.load
    
    load( [Object] row_1,.. ., [Object] row_n )
    
    
    load( [Array] data )
    
    
     returns true
    
    
    
    

    从单个行对象或者行对象的array 加载( 截断,然后添加) 新数据

    DataCollection.prototype.insert
    
    insert( [Object] row_1,.. ., [Object] row_n )
    
    
    insert( [Array] data )
    
    
     returns true
    
    
    
    

    从单个行对象或者行对象的array 插入新数据

    DataCollection.prototype.truncate
    
    truncate()
    
    
     returns true
    
    
    
    

    清空DataCollection的所有数据

    DataCollection.prototype.query
    
    query()
    
    
     returns DataCollectionQuery
    
    
    
    

    返回一个新 DataCollectionQuery,其中包含来自父服务器的所有数据的引用集。

    DataCollectionQuery对象

    DataCollectionQuery
    
    DataCollectionQuery()
    
    
    
    

    构造函数,只能通过 DataCollection.prototype.query() 访问

    方法

    DataCollectionQuery.prototype.filter
    
    filter( [Object] filters_1,.. ., [Object] filters_n )
    
    
     returns new DataCollectionQuery
    
    
    
    

    返回一个包含其父元素的引用子集的新 DataCollectionQuery。 包含筛选值( 请参见: 筛选器( )。

    通过单独的参数提供新的过滤对象,可以执行逻辑或者过滤集之间的。 ( 在筛选器集合中是逻辑的和

    DataCollectionQuery.prototype.exclude
    
    exclude( [Object] filters )
    
    
     returns new DataCollectionQuery
    
    
    
    

    返回一个包含其父元素的引用子集的新 DataCollectionQuery。 不包括筛选值( 请参见: 筛选器( )

    DataCollectionQuery.prototype.spawn
    
    spawn( [Boolean] ignoreIndex )
    
    
     returns new DataCollection
    
    
    
    

    从当前 DataCollectionQuery 中包含的所有数据创建一个新的DataCollection 对象( 非引用,新值)。 除非 ignoreIndex 被设置为 true,否则 inherit的父索引会。

    DataCollectionQuery.prototype.each
    
    each( [Function] callback -> ([Object] row, [Integer] index) )
    
    
     returns self
    
    
    
    

    循环遍历所有数据行,并为每个行执行 callback

    示例
    var dc =newDataCollection([{a:1, b:2}, {a:2, c:3}]);var query =dc.query();query.each(function(row, index) {
     console.log(index +': '+ row['a'] +', '+ row['b']);
    });// logs// 0: 1, 2// 1: 2, 3
    DataCollectionQuery.prototype.update
    
    update( [Object] values )
    
    
     returns self
    
    
    
    

    为当前选择中的每一行分配所有的key-value 对( 更新到当前选择的每一行)

    DataCollectionQuery.prototype.remove
    
    remove()
    
    
     returns true
    
    
    
    

    从父 DataCollection 中移除 DataCollectionQuery 中包含的所有行

    DataCollectionQuery.prototype.order
    
    order( [String] key, [Optional Boolean] orderDesc = false )
    
    
     returns DataCollectionQuery
    
    
    
    

    返回包含父行的新 DataCollectionQuery,它由特定的键( 如果 sortDesc = true,则递减) 排序。

    排序顺序如下( 无论ASC或者 DESC ): 函数,对象,日期对象,字符串,布尔值,布尔值,NaN,null,未定义

    根据字符串。布尔值和数字将根据它们的值进行排序,对象和相同的值将根据它们插入的顺序排序。

    DataCollectionQuery.prototype.sort
    
    sort( [String] key, [Optional Boolean] orderDesc = false )
    
    
     returns DataCollectionQuery
    
    
    
    

    .order的别名

    DataCollectionQuery.prototype.sequence
    
    sequence( [String or Number] indexedValue_1,.. ., [String or Number] indexedValue_n )
    
    
    sequence( [Array] indexedValues )
    
    
     returns DataCollectionQuery
    
    
    
    

    返回包含指定索引行的新 DataCollectionQuery,顺序按所提供的顺序排序。

    可以接受索引作为参数,也可以在 array 中接受。

    DataCollectionQuery.prototype.values
    
    values( [Optional String] key )
    
    
     returns Array
    
    
    
    

    如果提供了所有行对象的数组,则返回 array,或者返回来自特定键的所有值的一个字符串

    DataCollectionQuery.prototype.json
    
    json( [Optional String] key )
    
    
     returns String
    
    
    
    

    返回 .values()的json字符串版本

    DataCollectionQuery.prototype.max
    
    max( [String] key )
    
    
     returns Float
    
    
    
    

    返回包含在 DataCollectionQuery 子集中的键的最大值( JavaScript"大于(> )"

    DataCollectionQuery.prototype.min
    
    min( [String] key )
    
    
     returns Float
    
    
    
    

    返回包含在DataCollectionQuery子集中的键的最小值( JavaScript"大于(> )"

    DataCollectionQuery.prototype.sum
    
    sum( [String] key )
    
    
     returns Float
    
    
    
    

    返回 DataCollectionQuery 子集中包含的所有值的数值总和

    DataCollectionQuery.prototype.avg
    
    avg( [String] key )
    
    
     returns Float
    
    
    
    

    返回 DataCollectionQuery 子集中包含的键中所有值的数值平均值

    DataCollectionQuery.prototype.transform
    
    transform( [Object] keyMapPair )
    
    
     returns new DataCollectionQuery
    
    
    
    

    将当前DataCollectionQuery的每一行映射到具有指定键的新对象。

    keyMapPair中的"地图"可以是键的字符串表示形式,也可以是映射函数的字符串表示形式。

    dc.load([
     {a:1, b:2, c:3},
     {a:4, b:5, c:6}
     ]);
     dc.query().transform({d:'a', e:'b', f:function(row) { returnrow.a+row.b+row.c; }}).values();
     /* will return... [ {d: 1, e: 2, c: 6}, {d: 4, e: 5, c: 15} ]*/
    DataCollectionQuery.prototype.reduce
    
    reduce( [String] key, [Function] callback -> ([Any] prevValue, [Any] curValue, [Any] index) )
    
    
     returns Any
    
    
    
    

    DataCollectionQuery 子集中包含的键中包含的所有值运行指定的缩减函数。

    DataCollectionQuery.prototype.distinct
    
    distinct( [String] key )
    
    
     returns Array
    
    
    
    

    返回所有唯一值的array,其中包含来自 DataCollectionQuery 子集的指定键的( 转换为字符串)

    DataCollectionQuery.prototype.limit
    
    limit( [Integer] count )
    
    
    limit( [Integer] offset, [Integer] count )
    
    
     returns new DataCollectionQuery
    
    
    
    

    返回包含从当前 DataCollectionQuery 开始的第一个计数项,或者包含从偏移量开始的计数项。

    DataCollectionQuery.prototype.count
    
    count()
    
    
     returns Integer
    
    
    
    

    返回当前DataCollectionQuery中( 行)的项数

    滤波器

    DataCollection支持 filter()exclude() 函数中的许多过滤器。 如果你使用了 Django ORM或者签出了我们的另一个项目 FastAPI,那么许多人都很熟悉。

    使用时,所有过滤器都带有一个双下划线。

    请注意,DataCollection支持基于嵌套对象过滤( 排序和)。 语法是查找嵌套字段的is 筛选值是 {field__nestedField__is: 7}。 你可以使用双下划线无限期地嵌套。

    a === b

    检查是否等效。等同于没有指定的筛选器。 ( 只有字段名) 存在于标准化和边缘情况( 例如 )。 如果你的字段以 __ 结束)。

    a !== b

    检查 inequivalence。( 不完全匹配)。

    gt
    a > b

    检查所包含的值是否为 GREATER 值。

    gte
    a >= b

    检查包含的值是否为 GREATER,或者是否等于提供的值。

    a < b

    检查包含的值是否小于提供的值。

    lte
    a <= b

    检查包含的值是否小于或者等于提供的值。

    包含
    a.indexOf(b) >-1

    检查包含的值是否包含提供的值。 用于字符串或者数组。

    icontains
    a.toLowerCase().indexOf(b.toLowerCase()) >-1

    不区分大小写的大小写仅适用于字符串比较。

    b.indexOf(a) >-1

    检查所包含的值是否存在于所提供的值中。 用于字符串或者数组。

    not_in
    b.indexOf(a) ===-1

    检查所包含的值中是否不存在所包含的值。 用于字符串或者数组。

    测试和基准测试

    当前测试覆盖率为 100%

    这个存储库包含测试( 在 /tests 中),以确保一切按预期运行。

    root 存储库目录中有一个 node 服务器,可以用于测试 localhost:8888。 要启动服务器( 安装了 node ),只需运行:

    
    $ node testserv.js
    
    
    
    

    使用 运行测试,覆盖示例使用 Blanket.js。

    JavaScript开发人员控制台中记录了几个基准。

    确认

    to是麻省许可以证,随时可以在任何地方使用。 感谢你的检查 ! 我们欢迎好的,周到的捐赠。

    DataCollection是在 Storefront公司创建的。

    你可以在 Twitter 上随意执行以下操作:

    @thestorefront@keithwhor

    或者查看我们的GitHub知识库以获得更多库:

    在GitHub上的店面,的。


    数据  API  MAN  响应  
    相关文章