【问题标题】:adding and subtracting in a 'for' loop在 \'for\' 循环中加减
【发布时间】:2022-09-30 13:08:38
【问题描述】:

首先我想说我还是 JavaScript 新手,这是 CodeWars Kata公交车上的人数。

我也知道有一种更简单的方法可以完成这项任务,但如果我只是用谷歌搜索答案,我觉得我不会学到任何东西,所以这里是:

大家好, 在循环结束时,如何让它在重复时添加 a,减去 b?那叫什么?

IE。

[ 10, 0, 3, 5, 5, 8 ]

应该像这样工作数学:

[ 10 - 0 + 3 - 5 + 5 - 8 ]

它是一个 codewars kata,我知道有一种简单的方法可以做到这一点,但我已经走了很长一段路。

这是我要做的代码(以及作为测试用例的console.log)

var number = function (busStops) {
  let newBusStops = [];
  for (let i = 0; i < busStops.length; i++) {
    newBusStops = newBusStops.concat(busStops[i]);
  }
  //   return newBusStops;
  let passengers = 0;
  for (let i = 0; i < newBusStops.length; i++) {
    passengers += newBusStops[i];
  }
  return passengers;
};
// var number = function (busStops) {
//   let passengers = 0;
//   for (let i = 0; i < busStops.length; i++) {
//     passengers += parseInt(number[i]);
//     busStops.toString();
//     return busStops;
//   }
// };

// var number = function (busStops) {
//   for (let i = 0; i < busStops.length; i++) {
//     return busStops[i][0] - busStops[i][1];
//   }
// };
// return busStops[0][0];

console.log(
  number([
    [10, 0],
    [3, 5],
    [5, 8],
  ])
);
console.log(
  number([
    [3, 0],
    [9, 1],
    [4, 10],
    [12, 2],
    [6, 1],
    [7, 10],
  ])
);

我已经设法展平二维数组,但我只能添加展平的数组,我不知道该怎么做add a minus b。我不知道那叫什么所以我可以搜索一下

  • 你为什么决定展平阵列?这种结构是有意义的,因为您在每个条目中都有[+a, -b]
  • 我将它展平,二维数组对我来说是一个新概念,我无法让循​​环与二维数组一起工作
  • 尝试用二维数组来做。您的第二个 for 循环是一个很好的起点。在循环内部,您将有另一个数组,其中包含两个数字,例如[10, 0]。将第一个数字相加并从passengers 中减去第二个数字。试试看。

标签: javascript for-loop


【解决方案1】:

我会用计数索引遍历数组(就像你做的那样)。根据这个索引,我会从最后一个结果中添加或减去该值。

第一个提示: 循环使用这样的键值对数组

for (const [key, value] of array) {console.log(key, value);}

第二个提示: 减法是负数的加法

5-3 == 5+(3*-1)

第三个提示: 看看模运算符%

console.log(1%2);
console.log(2%2);
console.log(3%2);

解决方案:

 var number = function (busStops) {
   var total = 0;

   for (const [i, value] of busStops){
  total += value*(i%2?1:-1);
   }
   return total;
 }

【讨论】:

【解决方案2】:

尽管我建议您首先尝试自己解决 Kata,但我想根据您的代码提供一些解决方案以及使用 reduce 方法的替代解决方案。

二维数组和for 循环。

你在这个正确的轨道上。唯一缺少的是您没有从任何数字中添加或减去。除此之外,return 语句在您完成计算之前停止了循环。

var number = function (busStops) {
  let passengers = 0;
 
  for (let i = 0; i < busStops.length; i++) {
    passengers += busStops[i][0] - busStops[i][1];
  }
  
  return passengers;
};

console.log(
  number([
    [10, 0],
    [3, 5],
    [5, 8],
  ])
);

console.log(
  number([
    [3, 0],
    [9, 1],
    [4, 10],
    [12, 2],
    [6, 1],
    [7, 10],
  ])
);

带有for 循环和% 的扁平数组

正如@Marcus 所建议的那样,您可以使用模运算符来查看您是否处于循环中的偶数或奇数迭代中,从而决定是加还是减。此外,可以使用每个数组都有的 flat 方法进行展平。

var number = function (busStops) {
  let passengers = 0;
  const flattenedBustStops = busStops.flat();
   
  for (let i = 0; i < flattenedBustStops.length; i++) {
    if (i % 2 === 0) {
      passengers += flattenedBustStops[i];
    } else {
      passengers -= flattenedBustStops[i];
    }
  }
  
  return passengers;
};

console.log(
  number([
    [10, 0],
    [3, 5],
    [5, 8],
  ])
);

console.log(
  number([
    [3, 0],
    [9, 1],
    [4, 10],
    [12, 2],
    [6, 1],
    [7, 10],
  ])
);

二维数组和reduce

使用reduce 方法,您可以遍历数组并完全更改输出。在这种情况下,我们传递了一个初始值0,这是我们的累加器acc。然后我们循环遍历数组中的每个条目,在返回累加器之前添加和减去这些值。这种方法可以很快变得复杂,但在这种情况下很有意义。

const number = (busStops) => 
  busStops.reduce((acc, [add, remove]) => 
    acc += add - remove
  , 0);

console.log(
  number([
    [10, 0],
    [3, 5],
    [5, 8],
  ])
);

console.log(
  number([
    [3, 0],
    [9, 1],
    [4, 10],
    [12, 2],
    [6, 1],
    [7, 10],
  ])
);

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多