Обратите внимание, что суммирование чисел 1 сводится к подсчету чисел 1, что по-разному делают следующие решения:
с match
Вы можете использовать регулярное выражение /1/g
:
var p = "00110010";
var psum = (p.match(/1/g) || []).length;
console.log(psum);
match
возвращает массив подстрок, соответствующих шаблону 1
./
просто разделяет это регулярное выражение, а g
означает, что должны быть получены все совпадения (глобальные).Длина возвращаемого массива, таким образом, соответствует числу 1 с на входе.Если совпадений нет вообще, то match
вернет null
, поэтому у него нет свойства .length
.Чтобы позаботиться об этом, || []
проверит на это null
(что неверно в логическом выражении), и вместо null
.
с replace
* 1030 будет взято []
.* Это аналогичный принцип, но путем сопоставления не-1 символов и удаления их: var p = "00110010";
var psum = p.replace(/[^1]/g, "").length;
console.log(psum);
[^1]
означает: символ, который не равен 1. replace
заменит все совпадения вторым аргументом (пустой строкой), который сводится к возврату всех символовкоторые не совпадают.Это похоже на двойной минус: возвращаемые символы, которые не совпадают с , а не 1 .Таким образом, вы получите только 1 с :-) .length
будет считать их. С split
:
var p = "00110010";
var psum = p.split("1").length - 1;
console.log(psum);
split
разбивает строку на массив подстрок, которые не имеют заданной подстроки ("1").Таким образом, даже если «1» вообще отсутствует, вы получаете одну такую подстроку (целую строку).Это означает, что, получая длину, мы должны уменьшить ее на 1, чтобы получить число 1 с.
с рекурсивной функцией:
var p = "00110010";
var count1 = p => p.length && ((p[0] == "1") + count1(p.slice(1)));
var psum = count1(p);
console.log(psum);
Здесь вводится функция count1
.Сначала проверяется, является ли данная строка p пустой.Если это так, length
равен нулю, и это возвращается.Если не пустой, первый символ сравнивается с 1. Это может быть false или true.Этот результат преобразуется в 0 или 1 соответственно и добавляется к результату рекурсивного вызова.Этот рекурсивный вызов учитывает числа 1 в остальной части ввода (исключая первый символ, в котором уже были подсчитаны 1).