Js Как получить сумму чисел из строки? - PullRequest
0 голосов
/ 22 декабря 2018

Я новичок в кодировании, и мне задали этот вопрос;

Создайте функцию, которая принимает строку с путаницей букв и цифр.Следует сложить вместе все числа, которые появляются в строке, и вернуть итоговое значение.

   E.g. 'foo5bar6cat1' => 12
   'foo99cat' => 18

Совет. Для этого может быть полезно знать, что значение NaN в JavaScript ведет себя странно.Например, если вы делаете typeof NaN, он говорит вам, что это "number".Странно, а?

Код, который я написал, таков:

function sumDigitsFromString(str) {
let nums = []
let sum = 0

for (let i = 0; i < str.length; i++) {
if (typeOf (arr[i]) === "number") {
 nums.push(str[i])
    }
}
 for (let i = 0; i < nums.length; i++){
sum.push(nums[i] + sum)
   }
return sum
}

Тест, с которым работает мой код, таков:

describe("sumDigitsFromString", () => {
   it("picks out a digit from a string and returns", () => {
expect(sumDigitsFromString("foo5foo")).to.equal(5);
   });
     it("sums multiple digits from a string", () => {
expect(sumDigitsFromString("5foo5foo")).to.equal(10);
    });
it("returns a seum of several digits in a string", () => {
         expect(sumDigitsFromString("hello1world5this3is2a2string")).to.equal(13).;
   });
});

ДозаУ кого-нибудь есть предложения, как исправить мой код?

Ответы [ 5 ]

0 голосов
/ 25 декабря 2018

function numberAdd(str){
	var strArr = str.split(""), strTemp=0;
	for(i=0;i<strArr.length;i++){
		if(!isNaN(strArr[i])){
			strTemp+=parseInt(strArr[i]);
		}
	}
	return strTemp;
}

var str = 'foo5bar6cat1';
console.log(numberAdd(str));
0 голосов
/ 22 декабря 2018
  • typeOf предполагается равным typeof.Вы не хотите этого в своем коде, потому что это даст всем элементам в строковом массиве строковое значение.
  • Используйте parseInt(), чтобы сделать все элементы в числах массива и затем прополотьиз тех, кто возвращается NaN с isNaN()

    function sumDigitsFromString(str) {
        let nums = []
        let sum = 0
    
        for (let i = 0; i < str.length; i++) {
            if (!isNaN(parseInt(str[i]))) {
                sum += parseInt(str[i])
            }
        }
        return sum
    }
    
0 голосов
/ 22 декабря 2018

Вы почти на правильном пути.

if (typeOf (arr[i]) === "number") {

Я думаю, вы хотели использовать str[i] вместо arr[i].arr не был определен ранее.

if (typeof(str[i]) === "number") {

Это всегда будет ложным.Каждый str[i] является строкой.Правильно используется:

if (!isNaN(Number(str[i]))) {

, где, если str[i] не число, Number(str[i]) вернет NaN.

nums.push(str[i])

Вам нужно нажимать числа, а не строки.Используйте Number(str[i]).

sum.push(nums[i] + sum)

sum типа Number.Вы не можете нажать на номер.Вы должны добавить к этому номеру.Вместо этого используйте sum += nums[i].

Таким образом, полный рабочий код будет:

function sumDigitsFromString(str) {
  let nums = [];
  let sum = 0;

  for (let i = 0; i < str.length; i++) {
    if (!isNaN(Number(str[i]))) {
      nums.push(Number(str[i]));
    }
  }
  console.log(nums);
  for (let i = 0; i < nums.length; i++) {
    sum += nums[i];
  }
  return sum;
}

// Test it
console.log(sumDigitsFromString("foo5bar6cat1"));
0 голосов
/ 22 декабря 2018
let sum =0;
for(char of string)
    isNaN(parseInt(char)) ? sum=sum+0:sum=sum+parseInt(char);

это должно служить цели .... Используемый синтаксис ES6.

0 голосов
/ 22 декабря 2018

Ваш метод не будет работать по многим причинам. Попробуйте изменить свой метод следующим образом, и он должен выполнить свою задачу,

function sumDigitsFromString(str) {
    var sum = 0;
    var numbers = str.match(/\d+/g).map(Number);
    for (var i = 0; i < numbers.length; i++) {
        sum += numbers[i]
    }
    return sum;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...