0

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

3 回答 3

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
}
于 2013-09-11T16:27:44.290 回答
1

您的代码又好又快。我只建议缓存 arr.length:

for(var i=0, len=arr.length; i<len; i++)

也许是双重查找:

var item = arr[i];
my_obj[item] = item*2;     
于 2013-09-11T16:22:23.937 回答
1

首先,我喜欢总是为当前数组元素声明一个变量:

for(/*...*/){
   var x = arr[i];
   /*...*/
}

这没什么大不了的,但它让我不用一遍又一遍地输入 arr[i]。除此之外,您当前的代码非常好,也许唯一需要改变的就是性能改进,比如缓存数组长度。

也就是说,您可以考虑的一件事是使用迭代器函数而不是 for 循环:

arr.forEach(function(x, i){
   my_obj[x] = x*2;
});

这具有自动创建词法范围循环变量的优点,并且您不必多次引用数组(如果它是表达式而不是变量引用,则很有用)。

这种方法最重要的警告是,您不能像在常规循环中那样使用 break、continue 和 return 来控制流。此外,调用额外的函数会带来很小的性能损失,并且一些旧浏览器不支持将数组迭代方法作为内置函数,因此您需要使用 shim 或库函数。

于 2013-09-11T16:31:10.017 回答