Created
April 2, 2015 12:51
-
-
Save xophiix/9fa477ff67ab02ad9de3 to your computer and use it in GitHub Desktop.
parseCombinedPropertyStr.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 简易属性解释 | |
@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