设置属性';javascript中对象内深度未知的s值
如何使用未知的设置属性';javascript中对象内深度未知的s值,javascript,recursion,Javascript,Recursion,如何使用未知的arr[]length执行此操作 我推测我可能需要执行递归调用,可能需要在函数中传递类似于arr.slice(1)的内容,但我一直无法弄清楚它应该是什么样子。以下代码将遍历您的params对象,直到找到给定的键。它假设key.split(“.”返回一个正确的键数组(因此您可能需要在此处进一步清理输入) var params = { search: { make: "", model: "" } } function setVaria
arr[]
length执行此操作
我推测我可能需要执行递归调用,可能需要在函数中传递类似于
arr.slice(1)
的内容,但我一直无法弄清楚它应该是什么样子。以下代码将遍历您的params
对象,直到找到给定的键。它假设key.split(“.”
返回一个正确的键数组(因此您可能需要在此处进一步清理输入)
var params = {
search: {
make: "",
model: ""
}
}
function setVariable() {
var value = "BMW";
var key = "search.make";
var arr = key.split("."); //eg. ["search", "make"]
params[arr[0]][arr[1]] = value; // this works, but how do you
// do it with unknown arr[] length?
}
var参数={
搜索:{
制作:“,
型号:“
}
}
函数setVariable(){
var value=“宝马”;
var key=“search.make”;
var arr=key.split(“.”;//例如[“搜索”,“生成”]
var=params;
对于(var i=0,max=arr.length-1;i如果search
甚至不存在,该怎么办?是否要创建对象{make:value}
然后将其分配给params。search
?或者您只希望能够为现有属性设置值吗?这不会设置runner
变量的值,而不是原始params
变量吗?因为它总是工作在对象上,runner
和params
始终指向e同一个对象或其一部分。类似于runner=3;
的表达式会断开此连接,但向对象添加新键不会断开此连接。因此,上面的脚本毕竟应该向原始对象添加值。[也修复了打字错误]
var params = {
search: {
make: "",
model: ""
}
}
function setVariable() {
var value = "BMW";
var key = "search.make";
var arr = key.split("."); //eg. ["search", "make"]
var runner = params;
for( var i=0, max=arr.length-1; i<max; ++i ) {
// make sure the key exists
runner[ arr[i] ] = runner[ arr[i] ] || {};
// move one level deeper
runner = runner[ arr[i] ];
}
// set the value in the last level
runner[ arr[arr.length-1] ] = value;
}
var params = {
search: {
make: "",
model: "",
whatever: {
foo: {
bar: {
moo: 123,
meow: 'xyz'
}
}
}
}
};
function updatePath(obj, path, value) {
var parts = path.split('.');
var i, tmp;
for(i = 0; i < parts.length; i++) {
tmp = obj[parts[i]];
if(value !== undefined && i == parts.length - 1) {
tmp = obj[parts[i]] = value;
}
else if(tmp === undefined) {
tmp = obj[parts[i]] = {};
}
obj = tmp;
}
return obj;
}
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 123, meow: 'xyz' }
> updatePath(params, 'search.whatever.foo.bar.moo')
123
> updatePath(params, 'search.whatever.foo.bar.moo', 'test')
'test'
> updatePath(params, 'search.whatever.foo.bar.moo')
'test'
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 'test', meow: 'xyz' }
> updatePath(params, 'search.whatever.foo.bar.x.y.z', 'hi')
'hi'
> updatePath(params, 'search.whatever.foo.bar.x')
{ y: { z: 'hi' } }
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 'test',
meow: 'xyz',
x: { y: { z: 'hi' } } }
>