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