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
。我知道此代码有问题,因为映射和简化并不是我们想要的工作。
答案 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#map
,String#replace
,String#split
,Array#reduce
,语法为Arrow function。
您可以将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
是全球旗帜,可以获得所有可能的匹配。
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);
和String#replace
也可以使用。
String#split
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));

说明:
.map()
而不是.forEach()
。.map()
回调中,您可以将字符串转换为总数。.replace(/-/g, '').split('')
摆脱破折号并将其变成一组字母。.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);
}
为什么以这种方式编码?有很多好的理由。
您可以阅读代码并告诉它正在做什么。
与此相关,如果问题发生变化,很容易找出修改代码的位置。
我们可以轻松测试每个小功能,以确保它正常工作。
我们写的小函数在解决相关问题时可能会派上用场,所以我们减少了将来要做的工作量。