遍历JS对象/数组,如果找到匹配项,则更改值并返回原始对象/数组结构


Iterate through JS object/array, and if you find a match change the value and return the original object/array structure

我正在尝试在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