【问题标题】:Mapping and reducing new int array issues映射和减少新的 int 数组问题
【发布时间】:2016-05-05 07:32:45
【问题描述】:
var strings = [ '234-496-7459', '760-644-0201', '555-222-3333' ];
var ints = [];
console.log(strings);

strings.forEach(function(entry) {

    var ints = entry.replace(/-/g, '');
    console.log(ints);

});

var myResults = ints.map(function (el) {
    return el.toString().split('').reduce(function (sum, b) {
        return sum + +b;
    }, 0);
});

console.log(myResults);

我有一个字符串数组,我想取出破折号,然后将新数组存储为整数。我正在尝试减少 ints 的每个数组以创建一个打印出 53、30、33 的 myResults。我知道这段代码有问题,因为映射和减少不想工作。

【问题讨论】:

标签: javascript arrays dictionary reduce


【解决方案1】:

您需要在replace 之后将entry 值推入ints 数组中

var strings = [ '234-496-7459', '760-644-0201', '555-222-3333' ];
var ints = [];

strings.forEach(function(entry) {
    ints.push(entry.replace(/-/g, ''));
});

var myResults = ints.map(function (el) {
    return el.toString().split('').reduce(function (sum, b) {
        return sum + +b;
    }, 0);
});

alert(myResults);

【讨论】:

  • 使用map(),而不是push()
  • @SLaks,找不到你!
  • @RayonDabre 他的意思是,在原始数组上使用map 并在ints 数组中捕获结果。例如:var ints = myArray.map(el => el.replace(/-/g, '').toString().split('').reduce((sum, b) => sum + +b, 0));
  • @Tushar,问题中发布的代码流并没有这么说:(我刚刚纠正了丢失的内容!
【解决方案2】:

您可以像这样组合您的语句(在工作片段中):

    var strings = [ '234-496-7459', '760-644-0201', '555-222-3333' ];
    
    var ints = strings.map(function(item) {
        return item.replace(/-/g, '').split('').reduce(function(total, val) {
            return total + +val;
        }, 0);
    });

    document.write(JSON.stringify(ints));

解释:

  1. 您想将一个数组转换为另一个数组,因此请使用.map() 而不是.forEach()
  2. 然后,在.map() 回调中,您可以将字符串转换为总计。
  3. .replace(/-/g, '').split('') 去掉了破折号,把它变成了一个字母数组。
  4. .reduce() 然后在该数组上运行以总结所有数字。

【讨论】:

    【解决方案3】:

    如果你正在寻找另一种方式,你可以使用

    Array#mapString#replaceString#splitArray#reduceArrow function 语法。

    1. 您可以使用 RegEx /\d/gString#match 来获取单个数字作为数组。

      var ints = arr.map(el => el.match(/\d/g, '').reduce((sum, a) => sum + +a, 0));
      

      \d 匹配单个数字。 g 是全局标志,用于获取所有可能的匹配项。

    var arr = ['234-496-7459', '760-644-0201', '555-222-3333'];
    
    var ints = arr.map(el => el.match(/\d/g, '').reduce((sum, a) => sum + +a, 0));
    
    console.log(ints);
    document.write(ints);
    1. String#replaceString#split 也可以使用。

      var ints = arr.map(el => el.replace(/-/g, '').split('').reduce((sum, a) => sum + +a, 0));
      

    var arr = ['234-496-7459', '760-644-0201', '555-222-3333'];
    
    var ints = arr.map(el => el.replace(/-/g, '').split('').reduce((sum, a) => sum + +a, 0));
    
    console.log(ints);
    document.write(ints);

    ES5 中的等效代码

    var ints = arr.map(function (el) {
        return el.replace(/-/g, '').split('').reduce(function (sum, a) {
            return sum + +a;
        }, 0);
    });
    

    var arr = ['234-496-7459', '760-644-0201', '555-222-3333'];
    
    var ints = arr.map(function(el) {
      return el.replace(/-/g, '').split('').reduce(function(sum, a) {
        return sum + +a;
      }, 0);
    });
    console.log(ints);

    【讨论】:

      【解决方案4】:

      以自上而下的方式逐步解决此问题。对于每一步,我们将编写一个小规范,以便我们非常清楚我们想要做什么。如果我们把规范写好,那么 JS 就很容易跟上了。

      我们想写一个函数sum_digits_of_array,其规范是:

      sum_digits_of_array
      给定一个输入数组,返回一个新数组,其中每个元素是原始数组中相应元素的数字之和。

      这正是map的定义,所以我们可以这样写:

      function sum_digits_of_array(a) { return a.map(sum_digits); }
      

      现在我们只需要写sum_digits。我们还将为此编写规范:

      sum_digits
      给定一个输入字符串,返回该字符串的数字之和。

      这很简单:

      function sum_digits(s) { return sum(digits(s)); }
      

      现在为digits。同样,我们将为自己编写一个小规范:

      digits
      给定一个输入字符串,以数字形式返回单个数字的数组。

      我们将使用RegExp#match 来提取数字,而不是将其视为删除破折号然后拆分:

      function digits(s) { return s.match(/\d/g) . map(Number); }
      

      然后

      sum
      给定一个数字数组,返回所有数字的总和。

      这是reduce的定义,所以

      function sum(a) { return a.reduce(add); }
      

      然后

      add
      给定两个数,返回相加结果

      function add(a, b) { return a + b; }
      

      就是这样。所以整个解决方案,如果我们使用 ES6 箭头函数会更紧凑:

      function sum_digits_of_array(a) {
        const sum_digits = s      => sum(digits(s));
        const digits     = s      => s.match(/\d/g) . map(Number);
        const sum        = a      => a . reduce(add);
        const add        = (a, b) => a + b;
      
        return a . map(sum_digits);
      }
      

      为什么要以这种方式编码?有很多很好的理由。

      1. 您可以阅读代码并了解它在做什么。

      2. 与此相关,如果问题发生变化,很容易找出在哪里修改代码。

      3. 我们可以轻松测试每个小功能以确保其正常工作。

      4. 我们编写的小函数在解决相关问题时可能会派上用场,因此我们减少了未来要做的工作量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-09
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 2019-02-09
        • 2021-08-10
        • 1970-01-01
        相关资源
        最近更新 更多