Получить количество строк javascript

Как посчитать количество строк в строке в javascript

В качестве альтернативы вы можете попробовать метод разделения, как показано ниже.

var lines = $("#ptest").val().split("\n"); alert(lines.length); 

Не работает для этого тестового примера: ‘Roomy Below:\n\nStart again.’ . Он обнаруживает 3 строки, когда визуально их 4. Это связано с тем, что разделение объединяет обе новые строки вместе. — Простой

@SimplGy Что? Это не подводит. Он обнаруживает 3 линии, потому что есть 3 линии, даже визуально. console.log(‘Roomy Below:\n\nStart again.’) дает вам 3 строки. Если разделить объединенные новые строки, это не сработает: console.log(‘Roomy Below:\n\nStart again.’.split(‘\n’).join(‘\n’)) , но это так, и вы снова получите те же 3 строки. — Джулс

Вы правы, Джулс, я испортил этот случай воссоздания, потому что визуально это 3 строки (первая \ n завершает текстовую строку, а вторая создает пустую строку). Я уверен, что в какой-то момент мое возражение было основано на реальном жизненном сценарии, но я понятия не имею, что именно. — Простой

Если в вашем тексте для символов новой строки используется только ‘\ n’ (например, ‘s value ), вы можете рассмотреть возможность использования TEXT.match(/^/mg).length . — Константин Ван

@Khamidulla Вы неправильно подсчитали, «\ n \ n» состоит из 3 строк, каждая из которых содержит пустую строку. Каждая строка (даже пустая) имеет 1 строку, затем каждый \ n добавляет еще одну строку. На самом деле это то же самое, что смотреть на «1 \ n2 \ n3», то есть на числа 1, 2 и 3, каждое в отдельной строке. — сцена

Читайте также:  Авторизация через cookie php

Еще одно короткое, потенциально более эффективное, чем сплит-решение, решение:

const lines = (str.match(/\n/g) || '').length + 1 

ответ дан 23 мар ’19, в 16:03

Источник

Задача рассчитать и вернуть количество строк

Тут уже совсем близок к решению. Поучаю такой массив -> [ «g4», «a4», «z4», «l4», «u4»] Проблема вот в этой строке -> count = str.match(/a/g, «»).length; Тут всегда получаю 4 почему-то. Почему пока неясно. Хотелось бы увидеть более понятную реализацию, без однострочных функций и односимвольных переменных, пожалуйста.

6 ответов 6

Моя идея такая: считать в цикле в ассоциативный массив, где ключ — символ, значение — количество символа в строке. Я извиняюсь, что упростил ваш код. Не разбираюсь в бабелях.

const str = "ggggaaaazzzzzlllllluuuuuuuuu"; function strNumeric(s) < var tmp = []; for (var i = 0; i < s.length; i++) < var c = s[i]; tmp[c] = tmp[c] ? tmp[c] + 1 : 1; >var res = ""; for (var c in tmp) < res += c + tmp[c]; >return res; > console.log(strNumeric(str));

забавно. оказывается такое возможно, т.к. любой object можно использовать как ассоциативный массив. можно было бы написать: var tmp = new Date(), и все равно бы работало

const str = "ggggaaaazzzzzlllllluuuuuuuuu"; function strNumeric(s) < let r = ''; while(s) < const a = s[0]; const newS = s.replace(new RegExp(a, 'g'), ''); r += a + (s.length - newS.length); s = newS; >return r; > console.log(strNumeric(str));

Если существует несколько групп для одной и той же буквы:

const str = "ggggaaaazzzzzlllllluuuuuuuuugggggg"; function strNumeric(s) < let r = ''; let count = 1; for (let i = 1; i count++; > return r; > console.log(strNumeric(str));

пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править

const str = "ggggaaaazzzlllllluuuuuuuuu"; const strNumeric = (str) => < let main = [], count = 0, arr = []; [. str].forEach((item) =>< if (!arr.includes(item)) < count = str.match(new RegExp(item, "g")).length; arr = [. arr, item]; main = [. main, `$$`]; > else < count = 0; >>); return main; >; console.log(strNumeric(str).join(""));

Спасибо всем за ответы поставил всем плюсики.

let strNumeric = (str) => < let map = <>; let result = ""; [. str].forEach((char) => < !map[char] ? map[char] = 1 : map[char] = map[char] + 1; >) for(let char in map) < result += char + map[char] >return result; > 

добро пожаловать на Stack Overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править

Немного похож на ответ @Igor

const stringCount = "ggggaaaazzzzzlllllluuuuuuuuu"; const strNumeric = (str) => < // Это строка будет содержать результат выполнения функции в виде строки let countedStr = ''; // Переменная для отслеживания повторяющихся символов let count = 0; // Если у нас пустая строка выходим из выполнения функции if ( str.length === 0 )< return; >/* * Обычный цикл for для перебора строки * Отличие от привычного метода forEach который вы используете в том что * тут не нужна разбивка через метод split либо спред оператора */ for(let i = 0; i < str.length; i++)< // Счетчик для каждого повторяющегося символа count++; if (str[i] !== str[i + 1])< // Если символ не тот который был ранее добавляем его в countedStr // вместе с count и сбрасываем count countedStr += str[i] + count; count = 0; >> return countedStr; > console.log(strNumeric(stringCount));

Еще есть альтернативный алгоритм который делает обратное

Из этого «g4a4z5l6u9» делает это -> «ggggaaaazzzzzlllllluuuuuuuuu»

const countString = "g4a4z5l6u9"; const strNumeric = (str) => < let splittedString = str.split(""); for(let i = 1; i < splittedString.length; i++) < if (!isNaN(splittedString[i]) && !isNaN(splittedString[i - 1])) < splittedString[i - 1] = splittedString[i - 1] + splittedString[i]; splittedString.splice(i, 1); >> for (let i = 1; i < splittedString.length; i++ )< if ( !isNaN(splittedString[i]) )< splittedString[i - 1] = splittedString[i - 1].repeat(Number(splittedString[i])); splittedString.splice(i, 1); >> return splittedString.join(""); >; console.log(strNumeric(countString))

Комментарии ко второму коду добавлю потом.

Источник

JavaScript | Сколько строк в массиве?

Как узнать какое количество строк находится в массиве?

Когда мы говорим о массиве, то мы работаем с элементами и их индексами. В данном случае предполагается, что элементами массива являются строковые значения.

То есть по сути нам нужно узнать сколько элементов находится в массиве. Как это сделать?

var massiv = ["stroka1","stroka6","stroka3","stroka31","stroka600","stroka43434"]

Чтобы узнать сколько строк находится в этом массиве, нужно просто написать называние массива, затем поставить точку, затем написать слово «length«:

Массив из шести строк - JavaScript

Если в массиве присутствуют смешанные данные?

var massiv = [ , 123, [], "stroka1", [456], "stroka3", , "stroka2", 567, "stroka5", 183, "stroka6", true, false, "stroka4"]

Как узнать количество строковых данных в смешанном массиве?

Эту задачу нужно разделить на два этапа:

  1. Сначала фильтруем массив по типу данных String
  2. Потом считаем количество элементов после фильтрации

Фильтруем

Мы используем свойство конструктора, в котором был создан каждый элемент массива. Если элемент был создан конструктором класса String, то мы закидываем его в новый массив. Если нет, то проходим мимо.

Любой элемент массива будет принадлежать какому-то классу. По другому быть не может. Любой класс имеет свой собственный конструктор, поэтому у любого элемента массива можно получить название класса.

massiv.filter(i => i.constructor.name = color: #993300;">String")

Фильтруем массив на строки - JavaScript

После такой фильтрации мы получим только строковые значения. Любые числа, массивы, объекты, булевы и т.п. будут отброшены.

Считаем

massiv.filter(i => i.constructor.name = color: #993300;">String").length

Фильтруем массив на строки и считаем количество - JavaScript

Фильтр возвращает нам новый массив, в котором нужно просто получить значение свойства «length«.

В нашем случае получится число 6 . То есть из исходного массива мы извлекли 6 строковых элементов.

Информационные ссылки

Стандарт ECMAScript — Раздел «22.1 String Objects» — https://tc39.es/ecma262/#sec-string-objects

Стандарт ECMAScript — Раздел «23.1.3.7 Array.prototype.filter ( callbackfn [ , thisArg ] )» — https://tc39.es/ecma262/#sec-array.prototype.filter

Вам также может понравиться

ECMAScript | Двоичные логические операторы (Binary Logical Operators)

ECMAScript | Двоичные логические операторы (Binary Logical Operators)

Синтаксис двоичных логических операторов LogicalANDExpression [In, Yield, Await] : BitwiseORExpression [?In, ?Yield, ?Await] LogicalANDExpression [?In, ?Yield, ?Await] && BitwiseORExpression [?In, ?Yield, […]

JavaScript - Как склеить два массива с булевыми значениями

JavaScript | Как склеить два массива с булевыми значениями?

У нас есть два массива с булевыми значениями JavaScript (элементами обоих массивов являются булевы значения): var massiv1 = [true,true,true,true] var massiv2 = […]

Пример округления до 10 знака после точки - JavaScript

JavaScript | Как умножать дробные на целые?

Этого вопроса никогда бы не появилось, если бы не двоичная система счисления, которая подливает проблем при умножении дробных чисел на целые в […]

Fetch

Fetch

Версия стандарта от 06 августа 2020 г. Принимать участие: GitHub whatwg / fetch (новый выпуск, открытые выпуски) IRC: #whatwg на Freenode Фиксации: […]

Источник

Как получить количество строк в текстовой области?

Я хотел бы подсчитать количество строк в текстовой области, например:

line 1 line 2 line 3 line 4 

следует считать до 4 строк. В основном, нажав Enter один раз, вы переместитесь на следующую строку.

Следующий код не работает:

var text = $("#myTextArea").val(); var lines = text.split("\r"); var count = lines.length; console.log(count); 

Он всегда дает «1» независимо от того, сколько строк.

16 ответов

Я реализовал линии и методы lineCount как прототипы String:

String.prototype.lines = function() < return this.split(/\r*\n/); >String.prototype.lineCount = function()

Очевидно, что метод split не будет подсчитывать символ возврата каретки и / или символа новой строки в конце строки (или свойства innerText текстовой области) в IE9, но он будет считать его в Chrome 22, что приведет к другим результатам.

До сих пор я учитывал это, вычитая 1 из числа строк, когда браузер отличается от Internet Explorer:

String.prototype.lineCount = function()

Надеюсь, у кого-то есть лучший RegExp или другой обходной путь.

Проблема с использованием «\n» или «\r» заключается в том, что он подсчитывает только количество возвратов, если у вас есть длинная строка, которую можно обернуть, а затем она не будет считаться новой строкой. Это альтернативный способ получения количества строк, поэтому он может быть не лучшим.

Редактировать (спасибо, Алекс):

Если вы просто хотите проверить жесткие возвраты строки, это будет работать кроссплатформенно:

var text = $("#myTextArea").val(); var lines = text.split(/\r|\r\n|\n/); var count = lines.length; console.log(count); // Outputs 4 
var text = $("#myTextArea").val(); var lines = text.split("\n"); var count = lines.length; console.log(count); 

Однако это работает, если вам нужно использовать его, потому что это отвечает вашей проблеме

let text = document.getElementById("myTextarea").value; let lines = text.split(/\r|\r\n|\n/); let count = lines.length; console.log(count); 

Эта функция считает количество строк, имеющих текст в текстовой области:

function countLine(element) < var text = $(element).val(); var lines = text.split("\n"); var count = 0; for (var i = 0; i < lines.length-1; i++) < if (lines[i].trim()!="" && lines[i].trim()!=null) < count += 1; >> return count; > 

А как насчет разделения на \n вместо этого?

Также будет проблема, когда одна строка переносится в 2 строки в текстовой области.

Чтобы сделать это точно, вы можете использовать шрифт с фиксированной высотой и измерять пиксели. Это может быть проблематично, хотя.

Подсчет новых строк не является надежным способом определения количества строк, поскольку длинный текст может просто разорваться и по-прежнему считаться только одной строкой. Что вы хотите сделать, так это узнать scrollHeight текстового поля и разделить его на высоту одной строки.

Я использовал оригинальный ответ Mottie, но некоторые функции были изменены в JQuery API. Вот рабочая функция для текущего API v3.1.0:

var lht = parseInt($('#textarea').css('lineHeight'),10); var lines = $('#textarea').prop('scrollHeight') / lht; console.log(lines); 

Все вздымается от ответа Мотти!

Это будет направлено на рассмотрение строк с жестким и мягким возвратами:

 //determine what the fontsize will be let fontsize = 12; //get number of characters that can fit in a row let charsperrow = textarea.clientWidth / fontsize; //get any hard returns let hardreturns = textarea.textContent.split(/\r|\r\n|\n/); let rows = hardreturns.length; //loop through returns and calculate soft returns for(let i = 0,len = rows; i < len; i++)< let line = hardreturns[i]; let softreturns = Math.round(line.length / charsperrow); //if softreturns is greater than 0, minus by 1 (hard return already counted) softreturns = Math.round(softreturns >0 ? (softreturns - 1) : 0); rows += softreturns; > console.log(Math.round(rows)); 

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

 textArea.addEventListener('input', function() < setDynamicHeight(); >); function setDynamicHeight() < textArea.style.height = 0; // set the height to 0 in case of it has to be shrinked textArea.style.height = textArea.scrollHeight + 'px'; // set the dynamic height >

Обычный символ новой строки — «\n». Соглашение о некоторых системах также должно иметь заранее «\ r», поэтому в этих системах часто встречается «\ r \ n», означающий новую строку. В браузере, если пользователь намеренно не вводит «\ r», копируя его откуда-то еще, символ новой строки, вероятно, будет выражаться как просто «\n». В любом случае разделение на «\ n» будет подсчитывать количество строк.

       
Lines:
let count = 0 const a = document.querySelector('textarea') for (let i = 0; i < a.value.length; i++) < if (a[i] == '\n') < count++ >> console.log(count) 

Вместо textarea вы можете использовать div с атрибутом contenteditable=»true» . В div с этим атрибутом вы можете писать что угодно, как и в текстовом поле, но любая новая строка (кроме первой) автоматически переносится внутрь div . Вы можете использовать jQuery или JS для подсчета div и добавьте +1, что является первой строкой.

Понятно, я бы использовал это вместо textarea по любому поводу. У него есть несколько преимуществ. Он автоматически изменяет размер, вы можете легко подсчитывать пустые строки, вы можете настраивать каждый div или добавлять интервалы с цветами или размерами шрифта или чем-то еще, вы можете использовать любой line-height и любой font-size , вы можете добавить функции форматированного текста и многое другое, это лучше для SEO и многого другого. Вот рабочий пример с jQuery:

 $("#Editor").on("keyup mouseup", function()< blankSpace = $(this).find("br").length; //count blank lines urlCounter = $(this).find("div").length + 1 - blankSpace; $(".lineCounter").text("Number of links: "+ urlCounter); >);

Ваш ответ может быть сделан очень простым способом.

var text = $("#myTextArea").val(); // will remove the blank lines from the text-area text = text.replace(/^\s*[\r\n]/gm, ""); //It will split when new lines enter var lines = text.split(/\r|\r\n|\n/); var count = lines.length; //now you can count thses lines. console.log(count); 

Этот код для точных строк, заполненных в текстовой области. и будет работать наверняка.

Источник

Оцените статью