这是解决问题的方法;没什么问题,我只是对如何前进感到困惑。基本上我希望我的用户能够


通过“路径”的字符串表示指向具有任意深度的对象的任意键;
确认“路径”的每个步骤都存在;和
实现类似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/

10-11 11:27