Come tagliare una stringa in N caratteri in Javascript?


169

Come posso, usando Javascript, creare una funzione che taglierà la stringa passata come argomento, a una lunghezza specificata, anche passata come argomento. Per esempio:

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

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

Qualcuno ha idee? Ho sentito qualcosa sull'utilizzo della sottostringa, ma non ho capito bene.


1
"this is" = 7 caratteri, lo intendevi?
Aziz Punjani,

Come detto nella domanda, non sono troppo sicuro di come utilizzare la sottostringa per farlo. Potresti farmi un esempio, per favore? Accetterò ovviamente una risposta, se funziona;) @Interstellar_Coder oops, errore di battitura!

Risposte:


346

Perché non usare solo la sottostringa ... string.substring(0, 7);Il primo argomento (0) è il punto di partenza. Il secondo argomento (7) è il punto finale (esclusivo). Maggiori informazioni qui.

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

Grazie! Funziona perfettamente. Lo segnerò come risposta non appena sarà trascorso il limite di tempo!

24
E se vuoi ellissi per stringhe che superano la lunghezza massima (probabilmente più utile per un massimo più lungo): var string = "this is a string"; lunghezza var = 20; var trimmedString = string.length> lunghezza? string.substring (0, lunghezza - 3) + "...": string.substring (0, lunghezza);
Sarà il

5
Si noti che string.substr (inizio, lunghezza) si comporta in modo strano, tornerà vuoto se la lunghezza è maggiore della lunghezza della stringa. string.substring (inizio, fine) funziona come previsto, ovvero restituirà la stringa fino alla fine se non ci sono abbastanza caratteri per la fine data!
Centic

1
Usa string.substr. Non ha un comportamento strano, nonostante il commento precedente
Gibolt del

.substring(from, to)accetta indici . .substr (from, length) non ha, inoltre .substr () usato per avere un'incoerenza in IE quando il primo argomento è negativo.
Bob Stein,

47

Copiare il commento di Will in una risposta, perché l'ho trovato utile:

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

Grazie Will.

E un jsfiddle per chiunque si preoccupi https://jsfiddle.net/t354gw7e/ :)


1
Inutile utilizzare string.substring(0, length)nell'altro caso, poiché la stringa è garantita per essere <= 20 caratteri in quel punto, basta usare string.
Nick Sweeting,

15

Suggerisco di usare un'estensione per la pulizia del codice. Si noti che l'estensione di un prototipo di oggetto interno potrebbe potenzialmente interferire con le librerie che dipendono da esse.

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

E usalo come:

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

5
Perchè no? Perché stai sovrascrivendo il prototipo di un oggetto standard .trim(). Ciò può causare comportamenti imprevisti in altre librerie e strumenti che è possibile utilizzare.
Oleg Berman,

1
questo è quello di cui avevo bisogno
naneri il


2

Poco tardi ... ho dovuto rispondere. Questo è il modo più semplice.

// 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 dopo passo. .padEnd - Garantisce la lunghezza della stringa

"Il metodo padEnd () riempie la stringa corrente con una determinata stringa (ripetuta, se necessario) in modo che la stringa risultante raggiunga una determinata lunghezza. Il riempimento viene applicato dall'estremità (destra) della stringa corrente. La fonte per questo interattivo esempio è archiviato in un repository GitHub. " fonte: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

.substring: limita la lunghezza necessaria

Se si sceglie di aggiungere ellissi, aggiungerle all'output.

Ho fornito 4 esempi di usi JavaScript comuni. Consiglio vivamente di utilizzare il prototipo String con sovraccarico per il supporto legacy. Rende molto più semplice implementare e modificare in seguito.


Ciao! È utile includere anche alcune spiegazioni su cosa sta succedendo con il codice. Dato quanto è simile la tua soluzione alla risposta accettata, forse un piccolo dettaglio su ciò che padEndsta facendo.
Mattie,

La mia soluzione è molto più pulita e standardizzata e mostra molteplici usi. Il metodo padEnd () riempie la stringa corrente con una determinata stringa (ripetuta, se necessario) in modo che la stringa risultante raggiunga una determinata lunghezza. Il riempimento viene applicato dall'estremità (destra) della stringa corrente. La fonte per questo esempio interattivo è memorizzata in un repository GitHub. fonte: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Matthew Egan

1
Non sto contestando la qualità della tua risposta. Solo un suggerimento su come migliorarlo. La tua spiegazione è fantastica: modifica la tua risposta e inseriscila!
Mattie,

Ciao Matt, mi piace la tua risposta. È penoso che tu stia rispondendo a una domanda un po 'diversa. Inizialmente ha chiesto di tagliare una corda, non di restituire una lunghezza fissa.
Jakub Kriz,

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

Caso d'uso,

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

trimString(string, 20);

//How to trim a string...

-1

Penso che dovresti usare questo codice :-)

    // 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
Sono curioso di sapere perché hai aggiunto questa risposta. La domanda ha già una risposta accettata e molte altre risposte ragionevoli, tutte più semplici di questa. O il tuo ":-)" era destinato a renderlo uno scherzo?
Scott Sauyet,

Si noti che la risposta accettata è anche la risposta più votata. Penso che tu stia cercando di risolvere un problema diverso qui. (E non l'avevo notato quando commentavo prima.) Non è che è un problema improbabile, ma alla fine è solo leggermente correlato alla domanda posta. Il tuo ha anche lo strano effetto che con l'input dato, la tua stringa di output è 23lunga, più lunga del 17parametro predefinito più i 4caratteri nel suffisso " ...". Sembra strano.
Scott Sauyet,

Penso anche che questo potrebbe usare un'implementazione più semplice .
Scott Sauyet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.