Skip to content

Commit 25cf43d

Browse files
committed
Improved U.get() and U.set().
1 parent 2af39ae commit 25cf43d

2 files changed

Lines changed: 48 additions & 33 deletions

File tree

test/test-utils.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,10 @@ function other() {
397397
utils.copy({ name: 'A', age: -1 }, obj);
398398
assert.ok(obj.name === 'A' && obj.age === -1, 'utils.copy(rewrite=true)');
399399

400+
assert.ok(U.get(obj, 'arr').join(',') === '1,2,3,4', 'utils.get()');
401+
U.set(obj, 'address.city', 'Banská Bystrica');
402+
assert.ok(obj.address.city === 'Banská Bystrica', 'utils.set()');
403+
400404
var a = utils.reduce(obj, ['name']);
401405
var b = utils.reduce(obj, ['name'], true);
402406

@@ -627,7 +631,7 @@ function other() {
627631

628632
function Utils_Ls2_StringFilter() {
629633
var result;
630-
var async = new Utils.Async();
634+
var async = new U.Async();
631635

632636
async.await('U.ls2', function(next) {
633637
U.ls2(
@@ -650,7 +654,7 @@ function Utils_Ls2_StringFilter() {
650654

651655
function Utils_Ls_RegExpFilter() {
652656
var result;
653-
var async = new Utils.Async();
657+
var async = new U.Async();
654658

655659
async.await('U.ls', function(next) {
656660
U.ls(

utils.js

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const NODEVERSION = parseFloat(process.version.toString().replace('v', '').repla
7979
const STREAMPIPE = { end: false };
8080
const CT = 'Content-Type';
8181
const CRC32TABLE = '00000000,77073096,EE0E612C,990951BA,076DC419,706AF48F,E963A535,9E6495A3,0EDB8832,79DCB8A4,E0D5E91E,97D2D988,09B64C2B,7EB17CBD,E7B82D07,90BF1D91,1DB71064,6AB020F2,F3B97148,84BE41DE,1ADAD47D,6DDDE4EB,F4D4B551,83D385C7,136C9856,646BA8C0,FD62F97A,8A65C9EC,14015C4F,63066CD9,FA0F3D63,8D080DF5,3B6E20C8,4C69105E,D56041E4,A2677172,3C03E4D1,4B04D447,D20D85FD,A50AB56B,35B5A8FA,42B2986C,DBBBC9D6,ACBCF940,32D86CE3,45DF5C75,DCD60DCF,ABD13D59,26D930AC,51DE003A,C8D75180,BFD06116,21B4F4B5,56B3C423,CFBA9599,B8BDA50F,2802B89E,5F058808,C60CD9B2,B10BE924,2F6F7C87,58684C11,C1611DAB,B6662D3D,76DC4190,01DB7106,98D220BC,EFD5102A,71B18589,06B6B51F,9FBFE4A5,E8B8D433,7807C9A2,0F00F934,9609A88E,E10E9818,7F6A0DBB,086D3D2D,91646C97,E6635C01,6B6B51F4,1C6C6162,856530D8,F262004E,6C0695ED,1B01A57B,8208F4C1,F50FC457,65B0D9C6,12B7E950,8BBEB8EA,FCB9887C,62DD1DDF,15DA2D49,8CD37CF3,FBD44C65,4DB26158,3AB551CE,A3BC0074,D4BB30E2,4ADFA541,3DD895D7,A4D1C46D,D3D6F4FB,4369E96A,346ED9FC,AD678846,DA60B8D0,44042D73,33031DE5,AA0A4C5F,DD0D7CC9,5005713C,270241AA,BE0B1010,C90C2086,5768B525,206F85B3,B966D409,CE61E49F,5EDEF90E,29D9C998,B0D09822,C7D7A8B4,59B33D17,2EB40D81,B7BD5C3B,C0BA6CAD,EDB88320,9ABFB3B6,03B6E20C,74B1D29A,EAD54739,9DD277AF,04DB2615,73DC1683,E3630B12,94643B84,0D6D6A3E,7A6A5AA8,E40ECF0B,9309FF9D,0A00AE27,7D079EB1,F00F9344,8708A3D2,1E01F268,6906C2FE,F762575D,806567CB,196C3671,6E6B06E7,FED41B76,89D32BE0,10DA7A5A,67DD4ACC,F9B9DF6F,8EBEEFF9,17B7BE43,60B08ED5,D6D6A3E8,A1D1937E,38D8C2C4,4FDFF252,D1BB67F1,A6BC5767,3FB506DD,48B2364B,D80D2BDA,AF0A1B4C,36034AF6,41047A60,DF60EFC3,A867DF55,316E8EEF,4669BE79,CB61B38C,BC66831A,256FD2A0,5268E236,CC0C7795,BB0B4703,220216B9,5505262F,C5BA3BBE,B2BD0B28,2BB45A92,5CB36A04,C2D7FFA7,B5D0CF31,2CD99E8B,5BDEAE1D,9B64C2B0,EC63F226,756AA39C,026D930A,9C0906A9,EB0E363F,72076785,05005713,95BF4A82,E2B87A14,7BB12BAE,0CB61B38,92D28E9B,E5D5BE0D,7CDCEFB7,0BDBDF21,86D3D2D4,F1D4E242,68DDB3F8,1FDA836E,81BE16CD,F6B9265B,6FB077E1,18B74777,88085AE6,FF0F6A70,66063BCA,11010B5C,8F659EFF,F862AE69,616BFFD3,166CCF45,A00AE278,D70DD2EE,4E048354,3903B3C2,A7672661,D06016F7,4969474D,3E6E77DB,AED16A4A,D9D65ADC,40DF0B66,37D83BF0,A9BCAE53,DEBB9EC5,47B2CF7F,30B5FFE9,BDBDF21C,CABAC28A,53B39330,24B4A3A6,BAD03605,CDD70693,54DE5729,23D967BF,B3667A2E,C4614AB8,5D681B02,2A6F2B94,B40BBE37,C30C8EA1,5A05DF1B,2D02EF8D'.split(',').map(s => parseInt(s, 16));
82+
const REGISARR = /\[\d+\]$/;
8283

8384
exports.MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
8485
exports.DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
@@ -5425,63 +5426,73 @@ exports.parseTheme = function(value) {
54255426
return value === '?' ? F.config['default-theme'] : value;
54265427
};
54275428

5428-
exports.set = function(obj, path, value) {
5429+
global.SET = exports.set = function(obj, path, value) {
54295430
var cachekey = 'S+' + path;
54305431

54315432
if (F.temporary.other[cachekey])
54325433
return F.temporary.other[cachekey](obj, value);
54335434

5434-
var arr = path.split('.');
5435+
var arr = parsepath(path);
54355436
var builder = [];
5436-
var p = '';
5437-
5438-
for (var i = 0, length = arr.length; i < length; i++) {
5439-
p += (p !== '' ? '.' : '') + arr[i];
5440-
var type = arr[i] instanceof Array ? '[]' : '{}';
54415437

5442-
if (i !== length - 1) {
5443-
builder.push('if(typeof(w.' + p + ')!=="object"||w.' + p + '===null)w.' + p + '=' + type);
5444-
continue;
5445-
}
5446-
5447-
if (type === '{}')
5448-
break;
5449-
5450-
p = p.substring(0, p.lastIndexOf('['));
5451-
builder.push('if(!(w.' + p + ' instanceof Array))w.' + p + '=' + type);
5452-
break;
5438+
for (var i = 0; i < arr.length - 1; i++) {
5439+
var type = arr[i + 1] ? (REGISARR.test(arr[i + 1]) ? '[]' : '{}') : '{}';
5440+
builder.push('if(typeof(' + arr[i] + ')!==\'object\'||' + arr[i] + '==null)w.' + arr[i] + '=' + type + ';');
54535441
}
54545442

5455-
var fn = (new Function('w', 'a', 'b', builder.join(';') + ';w.' + path.replace(/'/, '\'') + '=a;return a'));
5443+
var fn = (new Function('w', 'a', 'b', builder.join(';') + ';var v=typeof(a)===\'function\'?a(MAIN.compiler.get(b)):a;w.' + arr[arr.length - 1] + '=v;return v'));
54565444
F.temporary.other[cachekey] = fn;
54575445
fn(obj, value, path);
54585446
};
54595447

5460-
exports.get = function(obj, path) {
5448+
global.GET = exports.get = function(obj, path) {
54615449

54625450
var cachekey = 'G=' + path;
54635451

54645452
if (F.temporary.other[cachekey])
54655453
return F.temporary.other[cachekey](obj);
54665454

5467-
var arr = path.split('.');
5455+
var arr = parsepath(path);
54685456
var builder = [];
5469-
var p = '';
54705457

5471-
for (var i = 0, length = arr.length - 1; i < length; i++) {
5472-
var tmp = arr[i];
5473-
var index = tmp.lastIndexOf('[');
5474-
if (index !== -1)
5475-
builder.push('if(!w.' + (p ? p + '.' : '') + tmp.substring(0, index) + ')return');
5476-
p += (p !== '' ? '.' : '') + arr[i];
5477-
builder.push('if(!w.' + p + ')return');
5478-
}
5458+
for (var i = 0, length = arr.length - 1; i < length; i++)
5459+
builder.push('if(!w.' + arr[i] + ')return');
54795460

5480-
var fn = (new Function('w', builder.join(';') + ';return w.' + path.replace(/'/, '\'')));
5461+
var fn = (new Function('w', builder.join(';') + ';return w.' + arr[arr.length - 1]));
54815462
F.temporary.other[cachekey] = fn;
54825463
return fn(obj);
54835464
};
54845465

5466+
function parsepath(path) {
5467+
5468+
var arr = path.split('.');
5469+
var builder = [];
5470+
var all = [];
5471+
5472+
for (var i = 0; i < arr.length; i++) {
5473+
var p = arr[i];
5474+
var index = p.indexOf('[');
5475+
if (index === -1) {
5476+
if (p.indexOf('-') === -1) {
5477+
all.push(p);
5478+
builder.push(all.join('.'));
5479+
} else {
5480+
var a = all.splice(all.length - 1);
5481+
all.push(a + '[\'' + p + '\']');
5482+
builder.push(all.join('.'));
5483+
}
5484+
} else {
5485+
all.push(p.substring(0, index));
5486+
builder.push(all.join('.'));
5487+
all.splice(all.length - 1);
5488+
all.push(p);
5489+
builder.push(all.join('.'));
5490+
}
5491+
}
5492+
5493+
return builder;
5494+
}
5495+
54855496
global.Async = global.async = exports.async;
54865497
global.sync = global.SYNCHRONIZE = exports.sync;
54875498
global.sync2 = exports.sync2;

0 commit comments

Comments
 (0)