Javascript 动态访问对象属性(JS)
我正在尝试使用字符串动态访问对象的属性。 例如: “.id.public”->anyObject[“id”][“public”] 问题-我不知道我有多少个参数(例如“.id”或“.id.public”或“.id.public.whatever”) 我做了一些变通:Javascript 动态访问对象属性(JS),javascript,Javascript,我正在尝试使用字符串动态访问对象的属性。 例如: “.id.public”->anyObject[“id”][“public”] 问题-我不知道我有多少个参数(例如“.id”或“.id.public”或“.id.public.whatever”) 我做了一些变通: var currentSplit = anyObject; var splitted = "id.public".split("\."); splitted.forEach(function(s) { currentSplit = c
var currentSplit = anyObject;
var splitted = "id.public".split("\.");
splitted.forEach(function(s) { currentSplit = currentSplit[s]; });
当我现在尝试覆盖对象属性时,我将覆盖引用而不是对象属性
currentSplit = "test";
我已经尝试过像
anyObject[“id.public”]=“test”
这样的东西,但没有成功。如果没有这样的小代码,你就无法做到这一点:
var mapToProperty = function(obj, path, value) {
if (!path) return obj;
var parts = path.split("."),
p = parts[0],
v = (typeof obj[p] === "function") ? obj[p](value) : (parts.length !==1 || !value) ? obj[p] : (obj[p] = value), value ;
if (parts.length == 1) return v;
return mapToProperty(v, parts.slice(1).join("."), value);
}
// use it like this
var myvalue = mapToProperty(myObj, "address.street")
// you can map into your objects as far as you want. obj1.obj2.obj3.prop
// you can set as well :-)
mapToProperty(myObj, "address.street", "This is great!")
另一种设置值的方法
function setVal(obj, path, val){
var paths = path.split('.'),
curProp = obj;
for(var i=0;i<paths.length-1;i++){
curProp = curProp[paths[i]];
}
curProp[paths[i]] = val;
}
库执行您想要的操作:
function get (obj, path) {
var keys = path.split('.');
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (!obj || !hasOwnProperty.call(obj, key)) {
obj = undefined;
break;
}
obj = obj[key];
}
return obj;
}
function set (obj, path, value) {
var keys = path.split('.');
for (var i = 0; i < keys.length - 1; i++) {
var key = keys[i];
if (deep.p && !hasOwnProperty.call(obj, key)) obj[key] = {};
obj = obj[key];
}
obj[keys[i]] = value;
return value;
}
函数get(对象,路径){
var keys=path.split('.');
对于(变量i=0;i
在javascript中,您无法使用字符串访问嵌套对象属性,您需要某种帮助函数来为您执行此操作,您可以查看angulars$parse
界面以获得一些启示。共享相同值的两个变量并不意味着您可以通过仅指定一个变量来更改这两个变量。您打算读取一个值吗t“id.public”或在“id.public”处写入值对您有用吗?引用错误:func未定义
,而且,它在哪里设置值
?此函数还将执行方法-例如,将一个对象与一个计算结果为obj1.method()的方法一起传递给它很抱歉,从我的库中复制的内容遗漏了erorr,已修复。请根据参数obj、stringmap、valueOK传入值。很抱歉,这是在方法上设置的,我可以修改它,以便在传递值时设置属性给我5!我个人会避免使用名称get
和set
,因为它们可以操作ors本身;但对我来说,这看起来很好,我只是从库中复制了代码,其中set
和get
是本地定义的,没有公开。我认为我的解决方案更好,它在一个超快速函数中完成,而且做得更多,它甚至可以执行一个方法并遍历该方法返回的任何对象,很多在一个小盒子里更聪明!
function get (obj, path) {
var keys = path.split('.');
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (!obj || !hasOwnProperty.call(obj, key)) {
obj = undefined;
break;
}
obj = obj[key];
}
return obj;
}
function set (obj, path, value) {
var keys = path.split('.');
for (var i = 0; i < keys.length - 1; i++) {
var key = keys[i];
if (deep.p && !hasOwnProperty.call(obj, key)) obj[key] = {};
obj = obj[key];
}
obj[keys[i]] = value;
return value;
}