Як обрізати рядок до N символів у Javascript?


169

Як я можу за допомогою Javascript зробити функцію, яка буде обрізати рядок, переданий як аргумент, на задану довжину, також передану як аргумент. Наприклад:

var string = "this is a string";
var length = 6;
var trimmedString = trimFunction(length, string);

// trimmedString should be:
// "this is"

Хтось мав ідеї? Я чув щось про використання підрядків, але не зовсім зрозумів.


1
"це" = 7 символів, чи ти це мав намір?
aziz punjani

Як сказано в питанні, я не надто впевнений, як використовувати підрядку для цього. Скажіть, будь ласка, приклад? Я прийму це відповідь, звичайно, якщо це працює;) @Interstellar_Coder, ой, помилково!

Відповіді:


346

Чому б не просто використати підрядку ... string.substring(0, 7);Перший аргумент (0) - вихідний пункт. Другий аргумент (7) - це кінцевий пункт (виключний). Більше інформації тут.

var string = "this is a string";
var length = 7;
var trimmedString = string.substring(0, length);

Дякую! Працює чудово. Я позначу це як відповідь, як тільки пройде термін!

24
І якщо ви хочете, щоб еліпси для рядків перевищували максимальну довжину (можливо, це корисніше для більшого максимуму): var string = "це рядок"; вар довжина = 20; var trimmedString = string.length> довжина? string.substring (0, довжина - 3) + "...": string.substring (0, довжина);
Буде

5
Зверніть увагу, що string.substr (початок, довжина) веде себе дивно, він повернеться порожнім, якщо довжина більше довжини рядка. string.substring (початок, кінець) працює так, як очікувалося, тобто поверне рядок до кінця, якщо для даного кінця недостатньо символів!
центральний

1
Використовуйте string.substr. Він не має дивної поведінки, незважаючи на попередній коментар
Gibolt

.substring(from, to)бере індекси . .substr (від, довжина) не робить, також .substr () використовувався для невідповідності в IE, коли перший аргумент є негативним.
Боб Штейн

47

Скопіював коментар Вілла у відповідь, тому що я вважав його корисним:

var string = "this is a string";
var length = 20;
var trimmedString = string.length > length ? 
                    string.substring(0, length - 3) + "..." : 
                    string;

Дякую Віллу.

І jsfiddle для всіх, хто дбає https://jsfiddle.net/t354gw7e/ :)


1
Немає сенсу використовувати string.substring(0, length)в іншому випадку, оскільки рядок гарантовано буде <= 20 символів у цьому пункті, просто використовуйте string.
Нік Солодкий

15

Я пропоную використовувати розширення для акуратності коду. Зауважте, що розширення прототипу внутрішнього об'єкта може потенційно заплутатися з залежними від них бібліотеками.

String.prototype.trimEllip = function (length) {
  return this.length > length ? this.substring(0, length) + "..." : this;
}

І використовувати його так:

var stringObject= 'this is a verrrryyyyyyyyyyyyyyyyyyyyyyyyyyyyylllooooooooooooonggggggggggggsssssssssssssttttttttttrrrrrrrrriiiiiiiiiiinnnnnnnnnnnnggggggggg';
stringObject.trimEllip(25)

5
Чому ні? Тому що ви перезаписуєте прототип стандартного об'єкта .trim(). Це може спричинити несподівану поведінку в інших бібліотеках та інструментах, які ви можете використовувати.
Олег Берман

1
ось що мені потрібно
naneri


2

Трохи пізно ... довелося відповідати. Це найпростіший спосіб.

// JavaScript
function fixedSize_JS(value, size) {
  return value.padEnd(size).substring(0, size);
}

// JavaScript (Alt)
var fixedSize_JSAlt = function(value, size) {
  return value.padEnd(size).substring(0, size);
}

// Prototype (preferred)
String.prototype.fixedSize = function(size) {
  return this.padEnd(size).substring(0, size);
}

// Overloaded Prototype
function fixedSize(value, size) {
  return value.fixedSize(size);
}

// usage
console.log('Old school JS -> "' + fixedSize_JS('test (30 characters)', 30) + '"');
console.log('Semi-Old school JS -> "' + fixedSize_JSAlt('test (10 characters)', 10) + '"');
console.log('Prototypes (Preferred) -> "' + 'test (25 characters)'.fixedSize(25) + '"');
console.log('Overloaded Prototype (Legacy support) -> "' + fixedSize('test (15 characters)', 15) + '"');

Крок за кроком. .padEnd - гарантує довжину рядка

"Метод padEnd () прошиває поточну рядок заданою рядком (повторюється, якщо потрібно), щоб отримана рядок досягала заданої довжини. Прокладка застосовується з кінця (праворуч) поточної рядка. Джерело для цього інтерактивного Приклад зберігається у сховищі GitHub. " джерело: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

.substring - обмеження потрібної вам довжини

Якщо ви вирішите додати еліпси, додайте їх до виводу.

Я наводив 4 приклади поширених звичаїв JavaScript. Настійно рекомендую використовувати прототип String з Overloading для застарілої підтримки. Це значно полегшує впровадження та зміну пізніше.


Привіт! Добре також включити пояснення щодо того, що відбувається з вашим кодом. З огляду на те, наскільки ваше рішення схоже на прийняту відповідь, можливо, трохи детальніше про те, що padEndробиться.
Матті

Моє рішення, набагато більш чистий і стандартизований плюс він показує багаторазове використання. Метод padEnd () прошиває поточний рядок заданою строкою (повторюється, якщо це потрібно), щоб результат, що вийшов, досягав заданої довжини. Прокладка застосовується з кінця (праворуч) поточного рядка. Джерело цього інтерактивного прикладу зберігається у сховищі GitHub. Джерело: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Метью Еган

1
Я не заперечую якості вашої відповіді. Просто пропозиція, як зробити це краще. Ваше пояснення чудове - відредагуйте свою відповідь і вкладіть її туди!
Матті

Привіт Метт, мені подобається твоя відповідь. Прикро, що ви відповідаєте на дещо інше запитання. Спочатку він запитував про обрізку струни, а не про повернення фіксованої довжини.
Якуб Криз

0
    let trimString = function (string, length) {
      return string.length > length ? 
             string.substring(0, length) + '...' :
             string;
    };

Використовуйте футляр,

let string = 'How to trim a string to N chars in Javascript';

trimString(string, 20);

//How to trim a string...

-1

Я думаю, що ви повинні використовувати цей код :-)

    // sample string
            const param= "Hi you know anybody like pizaa";

         // You can change limit parameter(up to you)
         const checkTitle = (str, limit = 17) => {
      var newTitle = [];
      if (param.length >= limit) {
        param.split(" ").reduce((acc, cur) => {
          if (acc + cur.length <= limit) {
            newTitle.push(cur);
          }
          return acc + cur.length;
        }, 0);
        return `${newTitle.join(" ")} ...`;
      }
      return param;
    };
    console.log(checkTitle(str));

// result : Hi you know anybody ...

1
Мені цікаво, чому ви додали цю відповідь. Питання вже має прийняту відповідь та декілька інших розумних відповідей, всі вони простіші за це. Або ваш ":-)" мав намір жартувати?
Скотт Сойет

Зауважте, що прийнята відповідь - це також відповідь, що найбільше оцінюється. Я думаю, ви намагаєтеся тут вирішити іншу проблему. (І я цього не помічав, коли коментував раніше.) Справа не в тому, що це малоймовірна проблема, але врешті-решт це лише трохи пов'язане із заданим питанням. Ваш також має дивний ефект, що при вказаному вході ваша вихідна рядок має 23символи довші, ніж 17параметр за замовчуванням плюс 4символи в суфіксі " ...". Це здається дивним.
Скотт Сойет

Я також думаю, що це може використати більш просту реалізацію .
Скотт Сойет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.