有没有办法使用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 };
});
答案 0 :(得分: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
})
如果需要,您也可以以相同的方式使用jquery的$.each
。
答案 1 :(得分:1)
肯定是,(从IE9开始):
var nums={};
[ 1, 2, 3, 4, 5].forEach(function(v, i) {
this[numberToName(v)]=v;
}, nums);
nums;
编辑:添加了一个索引,以便更容易分辨出正在发生的事情。
编辑:使用forEach使其变得完美,即使它与$。的.map()不太接近,它的运行速度比[] .map快3%。 (感谢thg435的提示!)