【问题标题】:Mapping key/value with javascript使用 javascript 映射键/值
【发布时间】:2013-07-31 21:08:37
【问题描述】:

有没有什么方法可以使用Javascript来映射数组中的键和值?在我看来,它类似于 jQuery .map(),但不是只映射值,还“映射”键。

假设我有以下数组:

var names = [ 1, 2, 3, 4, 5 ];

我喜欢使用我创建的名为numberToName() 的函数并从中生成另一个数组,结果应该是这样的:

var names = { "one": 1, "two": 2, "three": 3, "four": 4, "five": 5 };

目前我使用以下方法:

var names = [ 1, 2, 3, 4, 5 ],
    names_tmp = {},
    names_i = 0,
    names_len = names.length;

for(; names_i < names_len; names_i++) {
    names_tmp[numberToName(names[names_i])] = names[names_i];
}

问题是:有什么方法(最好是原生的)来改进这种方法?我什至可以毫无问题地使用 jQuery。或许类似这样的功能:

var names = jQuery.mapKeys([ 1, 2, 3, 4, 5], function(k, v) {
    return { key: numberToName(v), value: v };
});

【问题讨论】:

    标签: javascript jquery arrays map


    【解决方案1】:

    你正在寻找reduce:

    var names = [1, 2, 3, 4, 5].reduce(function(obj, k) {
         return obj[numberToName(k)] = k, obj;
    }, {});
    

    return obj[numberToName(k)] = k, obj 是一种写赋值+返回的简写方式(当然可读性较差):

         obj[numberToName(k)] = k;
         return obj;
    

    一个简单的forEach 也可以完成这项工作:

    names = {};
    [1, 2, 3, 4, 5].forEach(function(k) {
       names[numberToName(k)] = k
    })
    

    如果你愿意,你也可以以同样的方式使用 jquery 的$.each

    【讨论】:

    • 嗯,不,他不是。这是一种假装 reduce 是 map 或 foreach 的低级方式......
    • @dandavis:我看到你理解了这个问题并编辑了你的帖子。我认为forEachmap 好(如果你因为某种原因不喜欢reduce)。
    • 杀死关闭,我会删除我的答案。
    • @dandavis:让 OP 决定。
    • 我认为 .reduce() 对我来说效果更好,因为我需要将值作为数组直接返回给 var。 forEach 不会那样做。对吗?
    【解决方案2】:

    当然,(从 IE9 开始):

    var nums={};
    [ 1, 2, 3, 4, 5].forEach(function(v, i) {
        this[numberToName(v)]=v; 
    }, nums);
    
    nums;
    

    编辑:添加了一个索引,以便更容易判断发生了什么。

    编辑:通过使用 forEach 使其变得完美,即使它不像 $ 的 .map() 那样接近,它的运行速度确实比 [].map 快约 3%。 (感谢 thg435 的提示!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2020-09-27
      • 2019-06-12
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多