在javascript中,通过引用返回对象的成员

在javascript中,通过引用返回对象的成员,javascript,Javascript,我有一个json对象,它是可变的(可能有无限子结构): 我想找到第一个未定义的成员并返回其引用, 能够随时修改(通过事件触发功能) 但它不返回成员的引用,而是返回其值: var subObj=findFirstUndefined(myObject); subObj="my updated cool var!!"; 不修改对象 我发现像这样的图书馆可以做到这一点, 但在我看来,对于这样一项简单的任务来说,它似乎有点沉重 这不是一种优雅的方式吗?谢谢你 在JS中,如果传递值或引用,则无法手动控制

我有一个json对象,它是可变的(可能有无限子结构):

我想找到第一个未定义的成员并返回其引用, 能够随时修改(通过事件触发功能)

但它不返回成员的引用,而是返回其值:

var subObj=findFirstUndefined(myObject);
subObj="my updated cool var!!";
不修改对象

我发现像这样的图书馆可以做到这一点, 但在我看来,对于这样一项简单的任务来说,它似乎有点沉重


这不是一种优雅的方式吗?谢谢你

在JS中,如果传递值或引用,则无法手动控制

并且只有对象通过引用传递


不幸的是,你无法做到这一点。

JS不能做到这一点。您可以返回一个函数,该函数将分配给丢失的条目

return function(v) { obj[key] = v; };

如果您返回
obj[key]
显然是在返回一个值,但是尝试返回一个包含两个值的数组
[obj,key]
,您就有了一种引用该节点的方法。或者从递归函数中,您可以使用这些类型的对构建多维数组,以供以后使用。

根据您在注释中的要求,我将发布一种基于字符串路径获取/设置这些对象的方法。当然,这取决于你是否认为它太复杂了,但这就是问题所在

function getValue(object, path) {
    value = object[path[0]];
    if (path.length > 1) {
        return getValue(value, path.slice(1, path.length))
    }
    return value;
}

function setValue(object, path, value) {
    if (path.length > 1) {
        setValue(object[path[0]], path.slice(1, path.length), value);
    }
    else {
        object[path[0]] = value
    }
}

然后像这样使用它们:
getValue(myObject,[“s1”,“s2]”)/
设置值(myObject,[“s1”,“s2”],值)。我还没有机会测试代码,但这种方法应该适用。

您有一个对象,而不是JSON。您可以返回字符串
“s1”
,并使用
myObject[string]
访问它。不完全是按引用传递,但这是我能想到的最好的方法。它看起来像是返回未定义的值:
else if(obj[key]==undefined){return obj[key];
为了更改对象属性的值,你需要指定一个属性引用,例如,
obj.prop='new value';
@Šimevide如果你是对的,我没有双引号引用所有内容,我所说的json对象是通过字符串获取的,它不包含任何函数我非常喜欢这个解决方案。太好了!!我一直都是这样让我们忘记将javascript视为一种函数式语言!非常感谢!啊,是的,回答很好,我想要找到路径,您可以这样做:->另一个答案
function findFirstUndefinedPath(obj){
    for (var key in obj){
        var path=[key];
        if (typeof(obj[key]) === 'object'){
            var subPath=findFirstUndefinedPath(obj[key]);
            if (subPath!==false){
                return path.concat(subPath);
            }       
        }
        else if (obj[key]===undefined){
            return path;
        }   
    }
    return false; 
}
function getValue(object, path) {
    value = object[path[0]];
    if (path.length > 1) {
        return getValue(value, path.slice(1, path.length))
    }
    return value;
}

function setValue(object, path, value) {
    if (path.length > 1) {
        setValue(object[path[0]], path.slice(1, path.length), value);
    }
    else {
        object[path[0]] = value
    }
}
function findFirstUndefinedPath(obj){
    for (var key in obj){
        var path=[key];
        if (typeof(obj[key]) === 'object'){
            var subPath=findFirstUndefinedPath(obj[key]);
            if (subPath!==false){
                return path.concat(subPath);
            }       
        }
        else if (obj[key]===undefined){
            return path;
        }   
    }
    return false; 
}