我有一个可变的json对象(可能有无限的子结构):
var myObject={
s1:{
s2:'2',
s3:'3'
},
s4:'4',
s5:{
s6:undefined
},
s7:'7'
};
我想找到第一个未定义的成员并返回它的引用, 能够随时修改它(通过事件触发的功能)
function findFirstUndefined(obj){
for (var key in obj){
if (typeof(obj[key]) === 'object'){
var recursion=findFirstUndefined(obj[key])
if (recursion!==false){
return recursion;
}
}
else if (obj[key]===undefined){
return obj[key];
}
}
return false;
}
但它不会返回成员的引用,但它的值是:
var subObj=findFirstUndefined(myObject);
subObj="my updated cool var!!";
不会修改对象。
我发现像JsonPath这样的库可以做到这一点, 但对我来说,这样一个简单的任务似乎很重要。
这不是一种优雅的方式吗?感谢的!
答案 0 :(得分:5)
JS没有这样做。您可以改为返回一个将分配给缺失条目的函数吗?
return function(v) { obj[key] = v; };
答案 1 :(得分:1)
在JS中,如果传递了值或参考值,则无法手动控制。
只有对象通过引用传递。
所以不幸的是你不能那样做。
答案 2 :(得分:1)
正如您在评论中所要求的那样,我将发布一种基于字符串路径获取/设置这些对象的方法。你是否认为它当然太复杂了取决于你,但现在就是这样。
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"]);
/ setValue(myObject, ["s1", "s2"], value);
。我没有机会测试代码,但方法应该成立。
答案 3 :(得分:0)
如果返回obj[key]
,您显然会返回一个值,但尝试返回两个值[obj, key]
的数组,并且您可以引用该节点。或者从递归函数中,您可以构建一个包含这些对的多维数组,以供日后使用。
答案 4 :(得分:0)
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;
}