如何使用递归,剩余/扩展运算符和结构分解将数组中的这些数字加倍?

时间:2018-12-02 06:42:57

标签: javascript recursion ecmascript-6 destructuring

我最近完成了一个JavaScript挑战,要求返回一个初始数组的所有值都加倍的新数组。

const numbers = [1, 2, 3];

function double() {

}

只是我要包括一些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;

}

另一个要求是不使用任何数组辅助方法(映射,reuce等),因此我没有使用map(),而是使用了for循环。但是,我不能全神贯注于实现解构或休息/扩展运算符,我认为我很了解的概念,没关系递归。

5 个答案:

答案 0 :(得分:5)

这是一个可能的实现-分解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));

答案 1 :(得分:2)

这里有几种选择-

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 ]

使用高阶函数(接受或返回其他函数的函数)-

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 ]

答案 2 :(得分:0)

为什么我们可以使用下面的简单代码来使用递归

numbers = numbers.map(x => 2*x)

答案 3 :(得分:0)

我的解决方案如下-

person.id   Treatment   easy_comp   medium_comp   age   female
1_1          Happy         5             2         29     1
1_1          Happy         NA            NA        29     1
1_2          Happy         3             5         25     0
1_2          Happy         NA            NA        25     0
1_3
...

答案 4 :(得分:0)

另一种方式:

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)将返回double(2,3),依次返回double(3),最后double(3)将返回数组[2,4,6]