最近学习Cocos,在做单机案列的过程中,需要实现数据的读写。由于网页端,cocos 只提供cc.sys.localStorage的setItem和getItem基本的读写方法。遇到在数据关系较复杂的时候,查询和修改数据不方便的问题。
我的个人需求如下:
在商店购买的时候,更新玩家的背包,全部用json存储的话,结构稍复杂,于是上网找到如下2个库:
1、jslinq
2、typescriptlinq
经过试验测试:
第2个库各种尝试均报错,可能是我写错了,官方给的例子的是一元数组,官方例子也跑不出结果;最终选择jslinq库;
下面附上具体的方法及返回值:
//Where
where?: (condition: (el: T) => boolean) => JsLinq<T>;
//Select
select: (projection: (el: T) => any) => JsLinq<T>;
//GroupBy
groupBy?: (group: (el: T) => any) => JsLinqGroup<T>;
//Join
join?: (otherData: T[]) => JsLinq<T>;
//ToList
toList?: () => T[];
//Intersect
intersect?: (otherData: T[], comparisonField?: (el: T) => T) => JsLinq<T>;
//Distinct
distinct?: () => JsLinq<T>;
//OrderBy
orderBy?: (sortField: (el : T) => any) => JsLinq<T>;
//OrderByDescending
orderByDescending?: (sortField: (el: T) => any) => JsLinq<T>;
//SelectMany
selectMany?: <Q>(projection: (el: T) => Q[]) => JsLinq<Q>;
//SingleOrDefault
singleOrDefault?: (condition?: (el: T) => boolean) => T;
//FirstOrDefault
firstOrDefault?: (condition?: (el: T) => boolean) => T;
//LastOrDefault
lastOrDefault?: (condition?: (el: T) => boolean) => T;
//Any
any?: (condition?: (el: T) => boolean) => boolean;
//All
all?: (condition?: (el: T) => boolean) => boolean;
//Count
count?: () => number;
//Skip
skip?: (quantity: number) => JsLinq<T>;
//Take
take?: (quantity: number) => JsLinq<T>;
//Max
max?: (projection?: (el: T) => any) => T;
//Min
min?: (projection?: (el: T) => any) => T;
//Remove
remove?: (element: T) => JsLinq<T>;
//Subtract
subtract?: (otherData: T[], comparisonField?: (el : T) => T) => JsLinq<T>;
//Sum
sum?: (projection?: (el: T) => number) => number;
//Average
average?: (projection?: (el : T) => number) => number;
JSON数据的修改:由于JS对象赋值数组之后,对象直接指向原来数组的地址。直接修改JS对象,原数组的值就会对应修改
==============================================================================================
6.5更新:具体的使用方法举例
1、where
const tEq = jslinq(Equipment).where(p=>p['e_id']==pE['goods_id']).firstOrDefault();
2、remove
const singLeObj = jslinq(myPackage).where(p=>p['id']==this.packageObj['id']).singleOrDefault();
Global.playerControl.package = jslinq(myPackage).remove(singLeObj).toList();