ewm
Version:
小程序原生插件
129 lines • 3.7 kB
JavaScript
const WHITE_SPACE_CHAR_REGEXP = /^\s/;
const throwParsingError = (path, index) => {
throw new Error('Parsing data path "' +
path +
'" failed at char "' +
path[index] +
'" (index ' +
index +
')');
};
const parseArrIndex = (path, state) => {
const startIndex = state.index;
while (state.index < state.length) {
const ch = path[state.index];
if (/^[0-9]/.test(ch)) {
state.index++;
continue;
}
break;
}
if (startIndex === state.index) {
throwParsingError(path, state.index);
}
return parseInt(path.slice(startIndex, state.index), 10);
};
const parseIdent = (path, state) => {
const startIndex = state.index;
const ch = path[startIndex];
if (/^[_a-zA-Z$]/.test(ch)) {
state.index++;
while (state.index < state.length) {
const ch = path[state.index];
if (/^[_a-zA-Z0-9$]/.test(ch)) {
state.index++;
continue;
}
break;
}
}
else {
throwParsingError(path, state.index);
}
return path.slice(startIndex, state.index);
};
const parseSinglePath = (path, state) => {
const paths = [parseIdent(path, state)];
const options = {
deepCmp: false,
};
while (state.index < state.length) {
const ch = path[state.index];
if (ch === '[') {
state.index++;
paths.push(`${parseArrIndex(path, state)}`);
const nextCh = path[state.index];
if (nextCh !== ']')
throwParsingError(path, state.index);
state.index++;
}
else if (ch === '.') {
state.index++;
const ch = path[state.index];
if (ch === '*') {
state.index++;
const ch = path[state.index];
if (ch === '*') {
state.index++;
options.deepCmp = true;
break;
}
throwParsingError(path, state.index);
}
paths.push(parseIdent(path, state));
}
else {
break;
}
}
return { path: paths, options };
};
const parseMultiPaths = (path, state) => {
while (WHITE_SPACE_CHAR_REGEXP.test(path[state.index])) {
state.index++;
}
const ret = [parseSinglePath(path, state)];
let splitted = false;
while (state.index < state.length) {
const ch = path[state.index];
if (WHITE_SPACE_CHAR_REGEXP.test(ch)) {
state.index++;
}
else if (ch === ',') {
splitted = true;
state.index++;
}
else if (splitted) {
splitted = false;
ret.push(parseSinglePath(path, state));
}
else {
throwParsingError(path, state.index);
}
}
return ret;
};
const parseEOF = (path, state) => {
if (state.index < state.length)
throwParsingError(path, state.index);
};
export const parseMultiDataPaths = (path) => {
const state = {
length: path.length,
index: 0,
};
const ret = parseMultiPaths(path, state);
parseEOF(path, state);
return ret;
};
export const getDataOnPath = (data, path) => {
let ret = data;
path.forEach((s) => {
if (typeof ret !== 'object' || ret === null)
ret = undefined;
else
ret = ret[s];
});
return ret;
};
//# sourceMappingURL=data-path.js.map