代码之家  ›  专栏  ›  技术社区  ›  Dogbert

使用jQuery.map修改对象?

  •  4
  • Dogbert  · 技术社区  · 14 年前

    我有一对键值

    var classes = { red: 'Red', green: 'Green' };

    我要找的最终结果是

    classes = { 'a-red': 'Red', 'a-green': 'Green' };

    4 回复  |  直到 14 年前
        1
  •  5
  •   Nick Craver    14 年前

    像这样的方法会奏效:

    function prependObj(obj, prefix) {
      var result = {};
      for(var i in obj) if(obj.hasOwnProperty(i)) result[prefix+i] = obj[i];
      return result;
    }
    

    你可以这样称呼它:

    classes = prependObj(classes, "a-");
    

    You can test it here . 这是真的 修改原始对象,并且不具有任何jQuery依赖项,因此您可以在有或无jQuery依赖项的情况下使用它。

        2
  •  10
  •   pimlottc    12 年前

    给出的答案会起作用,但它们不像使用像$.map这样的纯函数构造那么有趣。下面是一个纯功能版本:

    $.extend.apply(null, $.map(classes, function(v,k) { var h = {}; h["a-" + k] = v; return h }));
    

    $.extend function 将所有这些组合成一个对象 .apply method 用于将参数作为数组传递给函数。

    不幸的是,没有一种好的方法来创建具有可变键名的对象文本,这使得这种方法很难看,而且可能没有那么有效,但它是一个漂亮的一行程序!

        3
  •  3
  •   user113716    14 年前

    $.each() .

    不能真正修改现有密钥,但可以用具有新密钥和旧值的新集合替换密钥/值对,然后删除旧集合。

    var classes = { red: 'Red', green: 'Green' };
    var newClasses = {};
    
    $.each( classes, function( key,val ) {
        newClasses["a-" + key] = val;
    });
    

    或者和一个普通的 for 循环:

    var classes = { red: 'Red', green: 'Green' };
    var newClasses = {};
    
    for( var name in classes ) {
        if( classes.hasOwnProperty( name ) )
            newClasses["a-" + key] = classes[name];
    });
    

    var classes = { red: 'Red', green: 'Green' };
    
    $.each( classes, function( key,val ) {
        classes["a-" + key] = val;
        delete classes[key];
    });
    

    编辑: 如果你想保留原始版本,或者在某些无限循环的浏览器中有问题(我正在测试…),请执行以下操作:

        4
  •  0
  •   John Morales    10 年前

    不要忘记javascript有闭包:

    var classes = { red: 'Red', green: 'Green' };
    var prefixedClasses = {}
    $.map(classes, function(v, k) {
     prefixedClasses['a-' + k] = v;
    });
    

    应该这么做。