使用 Array.map 作为 foreach 是一个好的实践吗?

3

我已经使用了Array.map,但是在相同的数据上,我需要进行其他一些计算。我应该在map内部进行这些计算还是在map之后使用for each进行计算?

    return res.data.map(function (obj) {
        if(obj.status.id == 6 || obj.status.id == 5){
            dateDifference(obj.created_at,obj.closed_at);
        }else{
            $scope.open++;
        }
        return {
            "id":obj.id,
            "subject": obj.subject,
            "requester": obj.requester.name,
            "assigned": obj.assigned ? obj.assigned.name : '',
            "priority": obj.priority.name,
            "status": obj.status.name,
            "category": obj.category.name,
            "created_at": moment(obj.created_at).utcOffset("06:00").format('lll'),
            "updated_at": moment(obj.updated_at).utcOffset("06:00").format('lll')
        }
     })

2
我认为Array.map是声明式的,不应该有任何副作用,但这只是我的个人看法。 - Jack Guy
1
这取决于......举个例子。 - Daniel A. White
1
严重得到了-2。我研究了一下,没有好的答案。 - Jason Spick
2
下降的票数可能是因为您没有明确指定“其他一些计算”究竟是什么。就像经常发生的那样,细节很重要。总的来说,这似乎更像是一个主观问题。 - Felix Kling
1
回调函数是否应该具有副作用是有争议的。根据MDN关于map的文档编写方式,预期甚至在某些时候map被调用的数组也会被修改,更不用说其他副作用了。同样地,规范也是如此:_"map不会直接改变调用它的对象,但对象可能会被回调函数的调用所改变。"_ - James Thorpe
显示剩余5条评论
1个回答

1

我不认为这是一种“好习惯”,但我也不认为这是一种坏习惯。事实是,.map()方法既用于迭代又用于创建新的结果数组。

也许答案在它的定义中。

来自JS网站

"map()方法通过在此数组中的每个元素上调用提供的函数来创建一个新数组,该数组包含函数的返回值。"

PHP网站(仅供娱乐):

"array_map()函数将回调函数作用到给定数组的每个元素上,并返回一个包含所有元素的新数组。"

没有什么阻止你在回调函数中做你想做的事情。

如果你个人不舒服这样做,你可以在构建自己的新数组时执行“for each”以达到相同的效果。对于你的特定情况,这可能是我会做的事情。我宁愿这样做,也不愿意在我的数组上迭代两次。

虽然,正如Bergi所提到的那样,如果在语义上有意义,最好对数组进行两次迭代。

如果性能成为问题(在长数组上进行两次迭代)。这是我倾向于做的:

for (var i=0; i<myArray.length; i++) {
    doStuffA(myArray[i]);
    doStuffB(myArray[i]);
}

这段文字在语义上非常清晰。不需要进行两次迭代。

当然,有些人可能会(很可能)不同意我的观点。


好的。这就是我提问的原因。不需要2次迭代。但我喜欢你使用foreach而不是map并创建新数组的想法。 - Jason Spick
“我宁愿这样做,也不想在数组上迭代两次。” - 如果在语义上有意义,迭代两次并没有什么问题。 - Bergi
我同意。我只是就特定提到的情况发表了我的意见。 - phenxd
如果你关心性能(或者任何事情),你就不会在数组上使用for...in枚举! :-) - Bergi
我确实关心一些事情... :/ 哈哈。谢谢你的信息,我会进行编辑! - phenxd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接