Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JavaScript Array.prototype.map与作用域变量一起使用是否是一种不好的做法_Javascript - Fatal编程技术网

将JavaScript Array.prototype.map与作用域变量一起使用是否是一种不好的做法

将JavaScript Array.prototype.map与作用域变量一起使用是否是一种不好的做法,javascript,Javascript,我知道map的作用是迭代列表,在每个成员上运行函数,并作为列表项返回或不返回值。但是,如果我像使用forEach一样使用它呢 例如: var stuff = [1, 2, 3]; var newStuff = {}; var moreStuff = []; stuff.forEach(function(value, key){ newStuff[value] = {'value' : value}; moreStuff.push({'other_stuff': value})

我知道map的作用是迭代列表,在每个成员上运行函数,并作为列表项返回或不返回值。但是,如果我像使用forEach一样使用它呢

例如:

var stuff = [1, 2, 3];

var newStuff = {};
var moreStuff = [];

stuff.forEach(function(value, key){
    newStuff[value] = {'value' : value};
    moreStuff.push({'other_stuff': value});
});

$('body').append('<div>1. ' + JSON.stringify(newStuff) + '/' + JSON.stringify(moreStuff) + '</div>');

//vs.

newStuff = {};
moreStuff = [];

stuff.map(function(value, key){
    newStuff[value] = {'value' : value};
    moreStuff.push({'other_stuff': value});
});

$('body').append('<div>2. ' + JSON.stringify(newStuff) + '/' + JSON.stringify(moreStuff) + '</div>');

我很确定,异步考虑因素是一样的,可能会把这个例子搞砸,结果也是一样的,但是为了讨论最佳实践,一种方法和另一种方法的缺点是什么?在函数中更改以前限定范围的变量而不实际返回任何内容,这是对map方法的滥用吗?正确的答案仅仅是一个判断问题吗?

其实没有太多的缺点-除了在forEach中,您没有返回新的列表。但在您的情况下,您需要一个新列表,所以使用.map


没有太多的缺点-除了在forEach中,您没有返回新列表。但在您的情况下,您需要一个新列表,所以使用.map


它起作用了。然而,在这里应用表明,最好使用已知/主要用途与您意图相符的函数,而不是使用另一个“标签外”函数。据我所知,这里没有使用.forEach over.map的技术理由,但由于使用.map产生副作用是一种不常见的模式,这将使您的代码比使用.forEach时更不清晰


如果您在一个团队环境中工作,许多人都会接触您的代码,那么为了最大限度地理解未来的意图,传统做法是值得的。

它是有效的。然而,在这里应用表明,最好使用已知/主要用途与您意图相符的函数,而不是使用另一个“标签外”函数。据我所知,这里没有使用.forEach over.map的技术理由,但由于使用.map产生副作用是一种不常见的模式,这将使您的代码比使用.forEach时更不清晰


如果您在一个团队环境中工作,许多人都会接触您的代码,那么为了最大限度地理解未来的意图,传统做法是值得的。

通过回调来映射、过滤、减少、删除代码,这是非常非常糟糕的做法,大多数阅读代码的人都希望回调返回新的数组元素,而不做其他事情

下面的内容更适合您的需要,更具可读性

var moreStuff = stuff.map(function(value) {
    return { otherStuff: value };
});

var newStuff = {};
stuff.forEach(function(value) {
   newStuff[value] = { value: value };
});

将带有副作用的回调传递给map、filter、reduce等是非常非常糟糕的做法。大多数阅读代码的人都希望回调返回新的数组元素,而不做其他事情

下面的内容更适合您的需要,更具可读性

var moreStuff = stuff.map(function(value) {
    return { otherStuff: value };
});

var newStuff = {};
stuff.forEach(function(value) {
   newStuff[value] = { value: value };
});

有一些明显的缺点,比如分配一个新数组并使代码混乱,但您的问题令人困惑:当您对结果不感兴趣时,为什么还要使用map而不是forEach?在这种情况下,为什么不构建更多的东西作为map的返回值呢?是的,有点混乱。我想从技术上讲,我对结果很感兴趣。下面的答案让它更清楚,因为意图是存在的,但实现可以改进。我想在实现中不改变两种对象类型会更清楚。我认为您误解了map的工作原理,tymeJV的答案可能解决了这一困惑,但为了确保:map将始终返回一个经过转换的数组,其值将是所提供函数应用于原始数组值的结果。如果所述函数未显式返回任何值,则它将是由函数隐式返回的未定义值数组。如果您希望最小化副作用,map是您的朋友。以这种方式使用它-您正在不遗余力地从.map中删除这一优点,并使您的代码更难理解。有一些明显的缺点,比如分配一个新数组并使代码混乱,但您的问题令人费解:当您对结果不感兴趣时,为什么还要使用map而不是forEach?在这种情况下,为什么不构建更多的东西作为map的返回值呢?是的,有点混乱。我想从技术上讲,我对结果很感兴趣。下面的答案让它更清楚,因为意图是存在的,但实现可以改进。我想在实现中不改变两种对象类型会更清楚。我认为您误解了map的工作原理,tymeJV的答案可能解决了这一困惑,但为了确保:map将始终返回一个经过转换的数组,其值将是所提供函数应用于原始数组值的结果。如果所述函数未显式返回任何值,则它将是由函数隐式返回的未定义值数组。如果您希望最小化副作用,map是您的朋友。以这种方式使用它-您将不遗余力地删除
这得益于.map,并使您的代码更难理解。同意,谢谢。我真的很喜欢@tymeJV的答案,因为它可以提高易读性和预期的实现。同意,谢谢。我真的很喜欢@tymeJV的答案,因为它可以提高易读性和预期的实现。一致同意,这是一个很好的解决方案,但我认为@tymeJV的解决方案以一种更有效的方式实现了这一点,并证明了地图的副作用并没有任何问题。。。还是有?一致同意的好解决方案,但我认为@tymeJV的解决方案以更有效的方式实现了这一点,并证明了地图的副作用并没有什么问题。。。还是有?
var moreStuff = stuff.map(function(value) {
    return { otherStuff: value };
});

var newStuff = {};
stuff.forEach(function(value) {
   newStuff[value] = { value: value };
});