以下是关于使用数组中的项填充对象的研究问题的初始解决方案... 但似乎应该有一个更好的解决方案。我读到“for ... in”不是正确的方法,但是有没有一些我忘记的更好的方法?
var doubler = function(arr) // fills object with numbers and their doubled value
{
var my_obj = {};
for(var i=0; i<arr.length; i++)
{
my_obj[arr[i]] = arr[i]*2;
}
console.log(my_obj);
}
doubler([5,7,2,3,4,7])
答案 0 :(得分:2)
为了好玩,请使用Array.prototype.reduce
:
function doubler(a) {
return a.reduce(function(o, n) {
o[n] = n * 2; // adds required key and value to object
return o; // returns filled object
}, {} ); // start with an empty object
}
reduce
获取一个数组和一个初始值({}
),并对数组的每个值和上一次迭代的结果依次执行 操作(其中a [0]和{}
用于第一次迭代)。
我通过引起副作用(对象的赋值)和刚刚获取初始对象(o == {}
)并在每次迭代中返回相同(修改过的)对象来稍微滥用它。
reduce
更惯用的用法是:
function addUp(a) {
return a.reduce(function(running_total, n) {
return running_total + n;
}, 0); // 0 is actually the default value
}
答案 1 :(得分:1)
您的代码很好而且速度很快。我只建议缓存arr.length:
for(var i=0, len=arr.length; i<len; i++)
也许是双重查询:
var item = arr[i];
my_obj[item] = item*2;
答案 2 :(得分:1)
首先,我喜欢总是为当前数组元素声明一个变量:
for(/*...*/){
var x = arr[i];
/*...*/
}
这不是什么大不了的事,但它让我无法一遍又一遍地输入arr [i]。除此之外,您当前的代码非常精细,也许唯一可以改变的是轻微的性能改进,例如缓存数组长度。
那就是说,你可以考虑使用迭代器函数而不是for循环:
arr.forEach(function(x, i){
my_obj[x] = x*2;
});
这具有自动创建词法范围循环变量的优点,并且您不必多次引用该数组(如果它是表达式而不仅仅是变量引用,则非常有用)。
这种方法最重要的警告是你不能像在常规循环中一样使用break,continue和return来获得控制流。此外,调用额外函数会有一个小的性能损失,而一些旧的浏览器不支持像内置函数那样的数组迭代方法,因此您需要使用填充或库函数。