Skip to content

Instantly share code, notes, and snippets.

@xophiix
Created April 2, 2015 12:51
Show Gist options
  • Save xophiix/9fa477ff67ab02ad9de3 to your computer and use it in GitHub Desktop.
Save xophiix/9fa477ff67ab02ad9de3 to your computer and use it in GitHub Desktop.
parseCombinedPropertyStr.js
/** 简易属性解释
@param object 访问对象
@param propertyStr 访问属性字符串,仅限于包含若干.或[]的组合,如"p1.p2[3][4].p5"
@param [newValue] 如果不为undefined,则执行 object.propertyStr = newValue
@return value of object.propertyStr if newValue !== undefined
*/
function parseCombinedPropertyStr(object, propertyStr, newValue) {
if (!propertyStr) {
return undefined;
}
var fields = propertyStr.split(".");
var fieldValue = object;
var fieldParentValue = object;
var lastFieldName = undefined;
function getFieldValue(object, field) {
if (!object || !field) {
throw new Error("invalid property str: " + propertyStr);
}
fieldParentValue = object;
lastFieldName = field;
return object[field];
}
for (var i = 0; i < fields.length; ++i) {
var field = fields[i];
var bracketStartPos = field.indexOf("[");
if (bracketStartPos >= 0) {
var remainPart = field.substring(bracketStartPos + 1);
field = field.substring(0, bracketStartPos);
fieldValue = getFieldValue(fieldValue, field);
var indexStr = "";
var j = 0;
do {
var indexStartPos = j;
while (j < remainPart.length && remainPart[j] !== "]") {
++j;
}
if (remainPart[j] === "]") {
indexStr = remainPart.substring(indexStartPos, j);
fieldValue = getFieldValue(fieldValue, indexStr);
if (j === remainPart.length - 1) {
break;
} else {
if (remainPart[j+1] === "[") {
j = j + 2;
if (j >= remainPart.length) {
throw new Error("invalid property str: " + propertyStr);
}
} else {
throw new Error("invalid property str: " + propertyStr);
}
}
} else {
throw new Error("invalid property str: " + propertyStr);
}
} while (j < remainPart.length);
} else {
fieldValue = getFieldValue(fieldValue, field);
}
}
if (newValue !== undefined) {
fieldParentValue[lastFieldName] = newValue;
} else {
return fieldValue;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment