Skip to content

Commit f433932

Browse files
committed
Add support for wildcard/array in json-prune
Add support for specially-named properties: `[]`, to iterate through all elements in an array, in order to deal more graciously with cases where the property to remove is an element in an array. An actual case: +js(json-prune, playlist.movies.0.adserver playlist.movies.1.adserver ...) Can be now converted to: +js(json-prune, playlist.movies.[].adserver) `*`, to iterate through all own properties of an object, in order to deal with random-named properties. For example (not an actual case): +js(json-prune, playlist.*.adserver) Where `adserver` would be a property member of an object which is itself a property of `playlist`, but which name is unknown or is variable.
1 parent da6cdf9 commit f433932

1 file changed

Lines changed: 24 additions & 12 deletions

File tree

β€Žassets/resources/scriptlets.jsβ€Ž

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -278,27 +278,42 @@
278278
}
279279
reLogNeedle = new RegExp(needle);
280280
}
281-
const findOwner = function(root, path) {
281+
const findOwner = function(root, path, prune = false) {
282282
let owner = root;
283283
let chain = path;
284284
for (;;) {
285-
if ( owner instanceof Object === false ) { return; }
285+
if ( owner instanceof Object === false ) { return false; }
286286
const pos = chain.indexOf('.');
287287
if ( pos === -1 ) {
288-
return owner.hasOwnProperty(chain)
289-
? [ owner, chain ]
290-
: undefined;
288+
const found = owner.hasOwnProperty(chain);
289+
if ( found === false ) { return false; }
290+
if ( prune ) {
291+
delete owner[chain];
292+
}
293+
return true;
291294
}
292295
const prop = chain.slice(0, pos);
293-
if ( owner.hasOwnProperty(prop) === false ) { return; }
296+
if (
297+
prop === '[]' && Array.isArray(owner) ||
298+
prop === '*' && owner instanceof Object
299+
) {
300+
const next = chain.slice(pos + 1);
301+
let found = false;
302+
for ( const item of owner.values() ) {
303+
found = findOwner(item, next, prune) || found;
304+
}
305+
return found;
306+
}
307+
if ( owner.hasOwnProperty(prop) === false ) { return false; }
294308
owner = owner[prop];
295309
chain = chain.slice(pos + 1);
296310
}
297311
};
298312
const mustProcess = function(root) {
299313
for ( const needlePath of needlePaths ) {
300-
const details = findOwner(root, needlePath);
301-
if ( details === undefined ) { return false; }
314+
if ( findOwner(root, needlePath) === false ) {
315+
return false;
316+
}
302317
}
303318
return true;
304319
};
@@ -314,10 +329,7 @@
314329
}
315330
if ( mustProcess(r) === false ) { return r; }
316331
for ( const path of prunePaths ) {
317-
const details = findOwner(r, path);
318-
if ( details !== undefined ) {
319-
delete details[0][details[1]];
320-
}
332+
findOwner(r, path, true);
321333
}
322334
return r;
323335
},

0 commit comments

Comments
Β (0)