如何使用递归、rest/spread 运算符和解构将数组中的这些数字加倍?
How to double these numbers in an array using recursion, rest/spread operators and destructuring?
我最近完成了一项 JavaScript 挑战,要求 return 一个新数组,其中初始数组的所有值都翻了一番。
const numbers = [1, 2, 3];
function double() {
}
除了我要包括一些解构和 rest/spread 运算符以及递归的 ES6 主题。好吧,我尽我所能完成了解决方案。这是我的解决方案:
const numbers = [1, 2, 3];
function double(arr){
const doubledNumbers = [];
for (var i = 0; i < arr.length; i ++){
const dubba = arr[i];
const bubba = dubba * 2;
doubledNumbers.push(bubba);
}
return doubledNumbers;
}
另一个要求是不使用任何数组辅助方法(map、reduce 等),所以我没有使用 map()
,而是 [=14] =] 循环。但是,我无法全神贯注地实施解构或 rest/spread 运算符,我认为我非常了解这些概念,更不用说递归了。
这里有一个可能的实现方式——解构double
的参数,取出数组中的第一个数,用rest语法把剩下的数放到另一个数组中。然后,double
数组的其余部分,并将其散布到一个新的(返回的)数组中,以第一个数字乘以 2:
const numbers = [1, 2, 3];
function double([firstNum, ...rest]) {
const restDoubled = rest.length ? double(rest) : [];
return [firstNum * 2, ...restDoubled];
}
console.log(double(numbers));
当我们可以使用如下简单代码做到这一点时,为什么要使用递归
numbers = numbers.map(x => 2*x)
我的解决方案如下-
const numbers = [1, 2, 3];
let finalResults = [];
function double(numbers) {
const [ number, ...rest ] = numbers;
if(number === undefined) {
return finalResults;
} else {
finalResults.push(number*2);
return double([...rest]);
}
}
这里有几个选择 -
const None =
Symbol("None")
const double = ([ x = None, ...more ]) =>
x === None
? []
: [ x * 2, ...double(more) ]
console.log(double([ 1, 2, 3, 4 ]))
// [ 2, 4, 6, 8 ]
没有解构 -
const double = (nums = [], i = 0) =>
i >= nums.length
? []
: [ nums[i] * 2, ...double(nums, i + 1) ]
console.log(double([ 1, 2, 3, 4 ]))
// [ 2, 4, 6, 8 ]
使用高阶函数(接受或return其他函数的函数)-
const None =
Symbol("None")
const identity = x =>
x
const map = ([ x = None, ...more ], f = identity) =>
x === None
? []
: [ f(x), ...map(more, f) ]
const double = (nums = []) =>
map(nums, n => n * 2)
console.log(double([ 1, 2, 3, 4 ]))
// [ 2, 4, 6, 8 ]
使用连续传递样式 -
const None =
Symbol("None")
const identity = x =>
x
const double = ([ x = None, ...more ], then = identity) =>
x === None
? then([])
: double(more, r => then([ x * 2, ...r ]))
double([ 1, 2, 3, 4 ], console.log)
// [ 2, 4, 6, 8 ]
另一种方式:
const numbers = [1, 2, 3];
const arr = [];
function double([x, ...some]) {
arr.push(x*2);
if(!some.length)
return arr;
return double(some);
}
double(1,2,3)
将 return double(2,3)
依次 return double(3)
最后 double(3)
将 return数组 [2,4,6]
我最近完成了一项 JavaScript 挑战,要求 return 一个新数组,其中初始数组的所有值都翻了一番。
const numbers = [1, 2, 3];
function double() {
}
除了我要包括一些解构和 rest/spread 运算符以及递归的 ES6 主题。好吧,我尽我所能完成了解决方案。这是我的解决方案:
const numbers = [1, 2, 3];
function double(arr){
const doubledNumbers = [];
for (var i = 0; i < arr.length; i ++){
const dubba = arr[i];
const bubba = dubba * 2;
doubledNumbers.push(bubba);
}
return doubledNumbers;
}
另一个要求是不使用任何数组辅助方法(map、reduce 等),所以我没有使用 map()
,而是 [=14] =] 循环。但是,我无法全神贯注地实施解构或 rest/spread 运算符,我认为我非常了解这些概念,更不用说递归了。
这里有一个可能的实现方式——解构double
的参数,取出数组中的第一个数,用rest语法把剩下的数放到另一个数组中。然后,double
数组的其余部分,并将其散布到一个新的(返回的)数组中,以第一个数字乘以 2:
const numbers = [1, 2, 3];
function double([firstNum, ...rest]) {
const restDoubled = rest.length ? double(rest) : [];
return [firstNum * 2, ...restDoubled];
}
console.log(double(numbers));
当我们可以使用如下简单代码做到这一点时,为什么要使用递归
numbers = numbers.map(x => 2*x)
我的解决方案如下-
const numbers = [1, 2, 3];
let finalResults = [];
function double(numbers) {
const [ number, ...rest ] = numbers;
if(number === undefined) {
return finalResults;
} else {
finalResults.push(number*2);
return double([...rest]);
}
}
这里有几个选择 -
const None =
Symbol("None")
const double = ([ x = None, ...more ]) =>
x === None
? []
: [ x * 2, ...double(more) ]
console.log(double([ 1, 2, 3, 4 ]))
// [ 2, 4, 6, 8 ]
没有解构 -
const double = (nums = [], i = 0) =>
i >= nums.length
? []
: [ nums[i] * 2, ...double(nums, i + 1) ]
console.log(double([ 1, 2, 3, 4 ]))
// [ 2, 4, 6, 8 ]
使用高阶函数(接受或return其他函数的函数)-
const None =
Symbol("None")
const identity = x =>
x
const map = ([ x = None, ...more ], f = identity) =>
x === None
? []
: [ f(x), ...map(more, f) ]
const double = (nums = []) =>
map(nums, n => n * 2)
console.log(double([ 1, 2, 3, 4 ]))
// [ 2, 4, 6, 8 ]
使用连续传递样式 -
const None =
Symbol("None")
const identity = x =>
x
const double = ([ x = None, ...more ], then = identity) =>
x === None
? then([])
: double(more, r => then([ x * 2, ...r ]))
double([ 1, 2, 3, 4 ], console.log)
// [ 2, 4, 6, 8 ]
另一种方式:
const numbers = [1, 2, 3];
const arr = [];
function double([x, ...some]) {
arr.push(x*2);
if(!some.length)
return arr;
return double(some);
}
double(1,2,3)
将 return double(2,3)
依次 return double(3)
最后 double(3)
将 return数组 [2,4,6]