映射并减少新的int数组问题

时间:2016-01-28 04:16:38

标签: javascript arrays dictionary reduce

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。我知道此代码有问题,因为映射和简化并不是我们想要的工作。

4 个答案:

答案 0 :(得分:0)

您需要在entry

之后推送ints数组中的replace



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);




答案 1 :(得分:0)

如果您正在寻找其他方式,可以使用

Array#mapString#replaceString#splitArray#reduce,语法为Arrow function

  1. 您可以将RegEx ArrayList arr = new ArrayList(); // populate your array XMLEncoder e = new XMLEncoder(BufferedOutputStream( new FileOutputStream("Test.xml"))); e.writeObject(arr); e.close(); String#match一起使用,将单个数字作为数组。

    /\d/g

    var ints = arr.map(el => el.match(/\d/g, '').reduce((sum, a) => sum + +a, 0)); 匹配一位数字。 \d是全球旗帜,可以获得所有可能的匹配。

  2. 
    
    g
    
    
    

    1. 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);String#replace也可以使用。

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

      ES5中的等效代码

      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);

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

答案 2 :(得分:0)

您可以将这些语句组合在一起(在一个工作的snipppet中):



    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 :(得分:0)

以自上而下的方式逐步实现。对于每个步骤,我们将编写一些规范,以便我们非常清楚我们想要做什么。如果我们很好地编写规范,那么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. 我们写的小函数在解决相关问题时可能会派上用场,所以我们减少了将来要做的工作量。