通过JS对象/数组迭代,如果找到匹配项,则更改该值并返回原始对象/数组结构

时间:2013-11-21 07:18:37

标签: javascript php jquery arrays

我试图在Javascript / Jquery中获得类似PHP的功能,我们传递值的地址(& $ value)并在PHP的实际数组结构中编辑它的值。例如,我有一个以下格式的对象,

var obj = {
    "first": "first value",
    "second": "second value",
    "third": "third value",
    "fourth": {
        "a": "good word",
        "b": "bad word"
    }
}

Array / Object可以是单维或多维的。我想迭代给定的数组/对象结构并修改它并返回实际的结构。

var obj = {
    "first": "modified value",
    "second": "second value",
    "third": "third value",
    "fourth": {
        "a": "good word",
        "b": "censored word"
    }
}

提前致谢!

3 个答案:

答案 0 :(得分:1)

这会递归地将函数应用于嵌套对象:

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;
})

答案 1 :(得分:0)

您可以使用for in loop迭代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 */

答案 2 :(得分:0)

此解决方案仅适用于对象({}),如果您确实需要包含数组([]),请告诉我们:

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