我正在尝试在Javascript/Jquery中获得类似PHP的功能,在这里我们传递值(&$value)的地址,并在PHP中的实际数组结构中编辑其值。例如,我有一个如下格式的对象,
var obj = {
"first": "first value",
"second": "second value",
"third": "third value",
"fourth": {
"a": "good word",
"b": "bad word"
}
}
数组/对象可以是单个的,也可以是多维的。我想遍历给定的数组/对象结构并对其进行修改,然后返回实际结构。
var obj = {
"first": "modified value",
"second": "second value",
"third": "third value",
"fourth": {
"a": "good word",
"b": "censored word"
}
}
提前感谢!
这递归地将函数应用于嵌套对象:
transform = function(obj, fun) {
if (typeof obj != "object")
return fun(obj);
Object.keys(obj).forEach(function(k) {
obj[k] = transform(obj[k], fun);
});
return obj;
}
用法:
transform(yourData, function(val) {
if (val.replace)
return val.replace(/bad/g, "censored");
else
return val;
})
您可以使用for循环遍历JS对象。
以下是文档中的一个示例:
var o = {a:1, b:2, c:3};
function show_props(obj, objName) {
var result = "";
for (var prop in obj) {
result += objName + "." + prop + " = " + obj[prop] + "'n";
}
return result;
}
alert(show_props(o, "o")); /* alerts: o.a = 1 o.b = 2 o.c = 3 */
此解决方案仅适用于对象({}
),如果您真的需要包括数组([]
),请告诉我:
function searchAndDestroy(o, word, replacement) {
var value, type;
for (var k in o) {
value = o[k];
type = Object.prototype.toString.call(value);
if (type === '[object Object]') {
searchAndDestroy(value, word, replacement);
} else if (type === '[object String]') {
o[k] = value.replace(new RegExp(word, 'g'), replacement);
}
}
return o;
}
用法:
var sanitized = searchAndDestroy(obj, 'bad word', 'censored word');
你需要知道的:
- PHP索引数组可以转换为Javascript数组(
[]
) - PHP关联数组可以转换为Javascript对象(
{}
) - 最后,Javascript复合数据类型,对象(
{}
)和数组([]
),总是通过引用传递的,没有办法改变这一点。因此,对于上述用例,sanitized
等于obj