这个迭代可以用一些更好的方法完成吗?

时间:2013-09-11 16:11:57

标签: javascript

以下是关于使用数组中的项填充对象的研究问题的初始解决方案... 但似乎应该有一个更好的解决方案。我读到“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])

3 个答案:

答案 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来获得控制流。此外,调用额外函数会有一个小的性能损失,而一些旧的浏览器不支持像内置函数那样的数组迭代方法,因此您需要使用填充或库函数。