下划线,查找和更改对象中的值

时间:2015-03-05 20:12:00

标签: javascript underscore.js

我正在尝试查找并替换对象中函数的值

我的对象如下:

 var testStates = [{
    "module": "module1",
    "customUrl": [
        { "mod1": "2" },
        { "mod2": "1" }
    ]
}, {
    "module": "module2",
    "customUrl": [
        { "mod3": "false" },
        { "mod4": "5" }
    ]
}
];

我的功能是这样的:

 myFunction = function(mod, name, replace){
 //replace item in testStates

}

基本上我试图做的就是使用那些变量来搜索内部mod是"模块" value,name是" mod"的键(如exampels中的mod1或mod2),replace是要在所选mod上替换的值。

所以,如果我说

 myfunction(module1, mod1, 5);

然后我想让对象看起来像

    var testStates = [{
    "module": "module1",
    "customUrl": [
        { "mod1": "5" },   ////Changed
        { "mod2": "1" }
    ]
}, {
    "module": "module2",
    "customUrl": [
        { "mod3": "false" },
        { "mod4": "5" }
    ]
}
];

有点像在对象上查找和替换。我不知道如何用下划线来解决这个问题,我会非常乐意为您提供帮助!谢谢你的阅读!

2 个答案:

答案 0 :(得分:1)

首先,您需要传入要处理的对象,因此您的函数的签名将是:

function myfunction (obj, mod, name, replace) {
  // Code
}

这个想法很简单:
迭代数组中的对象,如果模块名称与所需的模块名称相同,则检查customUrl的键以查找指定的键并将其替换为新值。

这是完整的功能:

function myfunction (obj, mod, name, replace) {
  _.each(obj, function(item) {
    if (item.module === mod) {
      _.each(item.customUrl, function(innerItem) {
        if (_.has(innerItem, name)) {
          innerItem[name] = replace;
        }
      });
    }
  });
}

here is a jsbin也有一个简单的测试。点击右上角的在JS Bin中编辑,您应该会在控制台标签中看到结果。

答案 1 :(得分:1)

是否真的有必要使用下划线?我宁愿用纯Javascript来做。这是一个更改已发送集合的工作示例。

var testStates = [
    {
        "module": "module1",
        "customUrl": [
            { "mod1": "5" },
            { "mod2": "1" }
        ]
    },
    {
        "module": "module2",
        "customUrl": [
            { "mod3": "false" },
            { "mod4": "5" }
        ]
    }
];

var myFunction = function(collection, mod, name, replace){
    var module, customUrl;

    module = collection.filter(function (elem) {
        return elem.module === mod;
    })[0];

    if (!module) {
        return collection;
    }

    customUrl = module.customUrl.filter(function (url) {
        return (typeof(url[name]) !== 'undefined')
    })[0];

    if (!customUrl) {
        return collection;
    }

    customUrl[name] = replace;

    return collection;
}

var returning = myFunction(testStates, 'module2', 'mod4', 'I changed this');

console.log(JSON.stringify(returning));
console.log(JSON.stringify(testStates));