Como cortar uma string para N caracteres em Javascript?

169

Como posso, usando Javascript, criar uma função que recorte a seqüência passada como argumento, com um comprimento especificado, também passada como argumento. Por exemplo:

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

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

Alguém tem ideias? Ouvi algo sobre o uso de substring, mas não entendi direito.

Lucio
fonte
1
"isto é" = 7 caracteres, você pretendia isso?
Aziz punjani
Como dito na pergunta, não tenho muita certeza de como usar a substring para fazer isso. Você poderia me dar um exemplo? Eu aceito é uma resposta, é claro, se funcionar;) @Interstellar_Coder oops, erro de digitação!

Respostas:

346

Por que não usar apenas substring ... string.substring(0, 7);O primeiro argumento (0) é o ponto de partida. O segundo argumento (7) é o ponto final (exclusivo). Mais informações aqui.

var string = "this is a string";
var length = 7;
var trimmedString = string.substring(0, length);
Vai
fonte
Obrigado! Funciona perfeitamente. Marcarei como resposta assim que o prazo for ultrapassado!
24
E se você quiser elipses para strings que excedam o comprimento máximo (provavelmente mais útil para um máximo maior): var string = "this is a string"; comprimento var = 20; var trimmedString = string.length> length? string.substring (0, comprimento - 3) + "...": string.substring (0, comprimento);
Will
5
Observe que string.substr (start, length) se comporta de forma estranha, retornará vazio se o comprimento for maior que o comprimento da string. string.substring (start, end) funciona como esperado, ou seja, retornará a string até o fim se não houver caracteres suficientes para o final especificado!
centic
1
Use string.substr. Não tem nenhum comportamento estranho, apesar do comentário anterior
Gibolt
.substring(from, to)leva índices . .substr (from, length) também não .substr () costumava ter uma inconsistência no IE quando o primeiro argumento é negativo.
Bob Stein
47

Copiando o comentário de Will em uma resposta, porque achei útil:

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

Obrigado Will.

E um jsfiddle para quem se importa https://jsfiddle.net/t354gw7e/ :)

Jon Lauridsen
fonte
1
Não faz sentido usar string.substring(0, length)no caso contrário, já que a string é garantida como <= 20 caracteres nesse ponto, basta usar string.
Nick Sweeting 17/05
15

Sugiro usar uma extensão para limpeza do código. Observe que estender um protótipo de objeto interno pode interferir com as bibliotecas que dependem deles.

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

E use-o como:

var stringObject= 'this is a verrrryyyyyyyyyyyyyyyyyyyyyyyyyyyyylllooooooooooooonggggggggggggsssssssssssssttttttttttrrrrrrrrriiiiiiiiiiinnnnnnnnnnnnggggggggg';
stringObject.trimEllip(25)
Zameer
fonte
5
Por que não? Porque você está substituindo o protótipo de um objeto padrão .trim(). Isso pode causar comportamento inesperado em outras bibliotecas e ferramentas que você pode usar.
precisa saber é o seguinte
1
isso é o que eu precisava
naneri
2

Um pouco tarde ... eu tive que responder. Esta é a maneira mais simples.

// 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) + '"');

Passo a passo. .padEnd - garante o comprimento da string

"O método padEnd () preenche a string atual com uma determinada string (repetida, se necessário), para que a string resultante atinja um determinado comprimento. O preenchimento é aplicado a partir do final (à direita) da string atual. A fonte para este interativo O exemplo é armazenado em um repositório do GitHub. " fonte: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…

.substring - limita o comprimento que você precisa

Se você optar por adicionar elipses, anexe-os à saída.

Dei 4 exemplos de usos comuns de JavaScript. Eu recomendo o uso do protótipo String com Sobrecarga para suporte legado. Torna muito mais fácil implementar e alterar posteriormente.

Matthew Egan
fonte
Olá! É bom também incluir algumas explicações sobre o que está acontecendo com seu código. Dada a similaridade da sua solução com a resposta aceita, talvez um pequeno detalhe sobre o que padEndestá fazendo.
Mattie
Minha solução é muito mais limpa e padronizada, além de mostrar vários usos. O método padEnd () preenche a sequência atual com uma determinada sequência (repetida, se necessário) para que a sequência resultante atinja um determinado comprimento. O preenchimento é aplicado a partir do final (à direita) da sequência atual. A fonte deste exemplo interativo é armazenada em um repositório GitHub. Fonte: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Matthew Egan
1
Não estou contestando a qualidade da sua resposta. Apenas uma sugestão sobre como torná-lo melhor. Sua explicação é ótima - edite sua resposta e coloque-a lá!
Mattie
Oi Matt, eu gosto da sua resposta. É lamentável que você esteja respondendo a uma pergunta um pouco diferente. Ele originalmente perguntou sobre aparar uma corda, não um tamanho fixo de retorno.
Jakub Kriz 23/06
0
    let trimString = function (string, length) {
      return string.length > length ? 
             string.substring(0, length) + '...' :
             string;
    };

Caso de Uso,

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

trimString(string, 20);

//How to trim a string...
MD. ABU TALHA
fonte
-1

Eu acho que você deve usar este código :-)

    // 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 ...
Babak
fonte
1
Estou curioso para saber por que você adicionou esta resposta. A pergunta já possui uma resposta aceita e várias outras respostas razoáveis, todas mais simples que isso. Ou o seu ":-)" tinha a intenção de fazer disso uma piada?
Scott Sauyet 01/01
Observe que a resposta aceita também é a resposta mais bem classificada. Acho que você está tentando resolver um problema diferente aqui. (E eu não tinha notado isso ao comentar anteriormente.) Não é que seja um problema improvável, mas no final está apenas um pouco relacionado à pergunta. O seu também tem o efeito estranho de que, com a entrada fornecida, sua sequência de saída possui 23caracteres longos, mais longos que o 17parâmetro padrão mais os 4caracteres no sufixo " ...". Isso parece estranho.
Scott Sauyet 6/03
Eu também acho que isso poderia usar uma implementação mais simples .
Scott Sauyet 6/03