2

有没有办法使用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 };
});
4

2 回答 2

5

您正在寻找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
})

如果需要,您也可以$.each以相同的方式使用 jquery。

于 2013-07-31T21:12:29.340 回答
1

当然是,(从 IE9 开始):

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

nums;

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

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

于 2013-07-31T21:11:50.920 回答