我需要编写一个获取整数数组的代码,如果它是偶数则返回一个元素增加的数组,如果是奇数则返回减少。 我尝试使用过滤器和映射JavaScript函数。这是代码:
var test=[2,5,8,13];
var my_function = (some_array) => some_array.filter((num,index,array) => num % 2 == 0 ? array[index]=num+1 : array[index]=num-1 );
console.log(my_function(test));
console.log(test);
此代码打印[2,5,8,13] [3,4,9,12] 使用地图时你有
var test=[2,5,8,13];
var my_function = (some_array) => some_array.map((num,index,array) => num % 2 == 0 ? array[index]=num+1 : array[index]=num-1 );
console.log(my_function(test));
console.log(test);
此代码打印[3,4,9,12] [3,4,9,12]
正如您在过滤器中看到的那样,克隆了对象,而使用map更改了对象。 MDN上的文档说:
map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。
我是否使用地图并以错误的方式过滤或文档错误? 我在chrome和firefox上测试了这种行为。
其实我使用了错误的地图功能。这是固定的地图代码
var my_function = (some_array) => some_array.map((num) => num % 2 == 0 ? num+1 : num-1 );
答案 0 :(得分:2)
您通过作为lambda中的第三个参数("数组")传递的引用来改变数组,并通过lambda的返回值返回一个新数组。映射和过滤器通常以函数样式使用,其中数组未发生变异,但是会创建一个新数组并从函数中返回。
你想在这里使用map而不是过滤器。虽然您当前的过滤器实现符合您的要求,但使用过滤器的惯用方法是输入一个数组,并返回一个新数组,该数组包含第一个数组中元素的子集,即满足传递表示的谓词的元素功能
使用map的惯用方法是输入一个数组,并返回一个与第一个数组长度相同的新数组,但是有一些函数应用于每个原始元素。这就是你想要的,你的函数应该只测试奇数/偶然然后分别返回n-1或n + 1.
答案 1 :(得分:0)
你错了。 Filter获取一个返回布尔值的函数,只留下该函数返回true的数组中的元素。这里发生的事情是,当你使用arr [i] =某些东西时,你们都修改了原始数组并返回了值为“something”的值,其值为true。这就是为什么修改原始数组并且函数返回原始数组而不进行修改的原因。 map函数返回从数组到函数结果的映射。由于您都修改了数组并返回了修改它的相同值,因此您有两个具有相同值的不同数组。
答案 2 :(得分:0)
要做你想做的事,你可以像这样使用 map :
var result = test.map(function(m){ return m % 2 === 0 ? m+1 : m-1 });
console.log(result);
也可以过滤,但就个人而言,我更喜欢地图。请记住,地图会返回带有结果的 new 数组。小心不要更改原始阵列。