这是解决问题的方法;没什么问题,我只是对如何前进感到困惑。基本上我希望我的用户能够
通过“路径”的字符串表示指向具有任意深度的对象的任意键;
确认“路径”的每个步骤都存在;和
实现类似CRUD的功能
我可以验证每个密钥是否有效,但是我只是在如何最终利用该路径而不最终使用eval()
语句时感到困惑,但是我当然不需要解释为什么我不让调用eval()
接近任意用户输入的任何位置。这是我所能得到的:
const SEP = "/" //in reality this is set by the server,
MyObjInterface = function() {
this.params = {};
this.response = {};
// suppose some initialization business, then on to the question... ( >.>)
this.updateOb= function(path, value ) {
path = path.replace('\\' + DS,"$DIRECTORY_SEPARATOR").split(DS);
for (var i = 0; i < path.length; i++) {
path[i].replace("$DIRECTORY_SEPARATOR",DS);
}
if (typeof(path) != "object" || path.length < 3) { // 3 = minimum depth to reach a valid field in any rset scheme
throw "Could not create rset representation: path either incorrectly formatted or incomplete."
}
var invalidPath = false;
var searchContext = path[0] === "params" ? this.params : this.response;
for (var i = 1; i < path.length - 1; i++) {
if (invalidPath) { throw "No key found in rset at provided path: [" + path[i] + "]."; }
if (i === path.length - 1) {
searchContext[path[1]] = value;
return true;
}
if (path[i] in searchContext) {
searchContext = searchContext[path[i]];
} else {
invalidPath = true;
}
}
}
};
最佳答案
您将路径分解为组件,然后递归地遍历树。
我的JS很弱,所以我将伪代码。
path = "go.down.three";
listOfElements = breakUpPath(path); // Now listOfElement = ["go", "down", "three"];
myObj = setObjectValue(myObj, listOfElement, "I'm a value");
function setObjectValue(obj, listOfElements, value) {
var firstPart = pop(listOfElements); // get and remove top of listOfElements stack
if (length(listOfElements) == 0) { // last element of the path, set the value
obj[firstPart] = value;
return obj;
} else {
// check if a property exists at all
var firstValue = obj[firstPart];
if (firstValue == null) {
firstValue = new Object();
obj[firstPart] = firstValue;
}
obj[firstPart] = setObjectValue(firstValue, listOfElement, value);
}
}
因此,正如我所说,我的JS很弱(真的很弱,我什至无法拼写JavaScript)。不用说,这是未经测试的。
但是您正在寻找类似的东西。沿着路径的各个元素进行操作即可。
关于javascript - 如何使用定界字符串在任意深度定位和修改对象键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23665472/