Bir dizeyi Javascript'te N karakterlerine nasıl kırpabilirim?


171

Javascript kullanarak, bağımsız değişken olarak geçirilen dizeyi belirli bir uzunluğa, ayrıca bağımsız değişken olarak geçirilen kesecek bir işlev nasıl yapabilirim. Örneğin:

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

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

Fikriniz olan var mı? Alt dize kullanma hakkında bir şeyler duydum, ancak tam olarak anlamadım.


1
"this" = 7 karakter, bunu düşündünüz mü?
aziz punjani

Soruda belirtildiği gibi, bunu yapmak için alt dizeyi nasıl kullanacağımdan emin değilim. Bana bir örnek verebilir misiniz? Kabul edeceğim tabii ki bir cevap, eğer işe yarıyorsa;) @Interstellar_Coder ayy, yazım hatası!

Yanıtlar:


348

Neden sadece alt dize kullanmıyorsunuz ... string.substring(0, 7);İlk argüman (0) başlangıç ​​noktasıdır. İkinci argüman (7) bitiş noktasıdır (münhasır). Daha fazla bilgi burada.

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

Teşekkürler! Mükemmel çalışıyor. Zaman sınırı geçer geçmez cevap olarak işaretleyeceğim!

24
Ve maksimum uzunluğu aşan dizeler için elips istiyorsanız (muhtemelen daha uzun max için daha yararlıdır): var string = "Bu bir dizedir"; var uzunluk = 20; var trimmedString = string.length> uzunluk? string.substring (0, uzunluk - 3) + "...": string.substring (0, uzunluk);
Will

5
Lütfen string.substr (başlangıç, uzunluk) tuhaf davrandığını, uzunluk dizenin uzunluğundan fazla ise boş döneceğini unutmayın. string.substring (start, end) beklendiği gibi çalışır, yani verilen son için yeterli karakter yoksa dizeyi sonuna kadar döndürür!
centic

1
Kullanın string.substr. Önceki yoruma rağmen garip bir davranışı yok
Gibolt

.substring(from, to)endeks alır . .substr (uzunluk, dan) does not Ayrıca .substr () için kullanılan ilk argüman negatif olduğunda IE bir tutarsızlık vardır.
Bob Stein

48

Will'in yorumunu bir cevaba kopyalamak , çünkü yararlı buldum:

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

Teşekkürler Will.

Ve https://jsfiddle.net/t354gw7e/ umurunda olan herkes için bir jsfiddle :)


1
Diğer string.substring(0, length)durumda kullanmanın bir anlamı yoktur , çünkü dizenin o noktada <= 20 karakter olacağı garanti edilir, sadece kullanın string.
Nick Sweeting

15

Kod düzgünlüğü için bir uzantı kullanmanızı öneririz. Dahili bir nesne prototipinin genişletilmesinin, kendilerine bağlı kitaplıklar ile karışıklık yaratabileceğini unutmayın.

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

Ve şöyle kullanın:

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

5
Neden olmasın? Çünkü standart bir nesnenin prototipinin üzerine yazıyorsunuz .trim(). Bu, kullanabileceğiniz diğer kitaplıklarda ve araçlarda beklenmeyen davranışlara neden olabilir.
Oleg Berman

1
ihtiyacım olan şey bu
naneri


2

Biraz geç ... Cevap vermeliydim. Bu en basit yol.

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

Adım adım. .padEnd - Dizenin uzunluğunu garanti eder

"PadEnd () yöntemi, geçerli dizeyi belirli bir dizeyle (gerekirse tekrarlanır) doldurur, böylece elde edilen dizgi belirli bir uzunluğa ulaşır. Dolgu, geçerli dizenin ucundan (sağda) uygulanır. örneği GitHub deposunda saklanır. " kaynak: developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…

.substring - ihtiyacınız olan uzunluğun sınırları

Elips eklemeyi seçerseniz, bunları çıktıya ekleyin.

4 yaygın JavaScript kullanımı örneği verdim. Eski destek için Overloading ile String prototipini kullanmanızı şiddetle tavsiye ederim. Daha sonra uygulanmasını ve değiştirilmesini çok daha kolay hale getirir.


Merhaba! Kodunuzda neler olup bittiğine dair bazı açıklamalar da eklemeniz iyi olur. Çözümünüzün kabul edilen cevaba ne kadar benzediği göz önüne alındığında, belki ne yaptığı hakkında biraz ayrıntı padEnd.
Mattie

Benim çözümüm, çok daha temiz ve daha standart bir artı birden fazla kullanım gösteriyor. PadEnd () yöntemi, geçerli dizeyi belirli bir dizeyle (gerekirse tekrarlanır) doldurur, böylece elde edilen dizgi belirli bir uzunluğa ulaşır. Dolgu, geçerli dizenin ucundan (sağ) uygulanır. Bu etkileşimli örneğin kaynağı GitHub deposunda saklanır. kaynak: developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Matthew Egan

1
Cevabınızın kalitesini tartışmıyorum. Sadece nasıl daha iyi hale getirileceğine dair bir öneri. Açıklamanız harika - cevabınızı düzenleyin ve oraya koyun!
Mattie

Merhaba Matt, cevabını beğendim. Biraz farklı bir soruya cevap vermeniz üzücü. Başlangıçta dönen bir dize uzunluğunu değil, bir ipi düzeltmeyi sordu.
Jakub Kriz

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

Kullanım Durumu,

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

trimString(string, 20);

//How to trim a string...

-1

Bu kodu kullanmanız gerektiğini düşünüyorum :-)

    // 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
Bu cevabı neden eklediğinizi merak ediyorum. Sorunun zaten kabul edilmiş bir yanıtı ve hepsi de bundan daha basit olan diğer makul cevapları var. Yoksa ":-)" bu şaka yapmak için miydi?
Scott Sauyet

Kabul edilen yanıtın aynı zamanda en yüksek puanlı cevap olduğunu unutmayın. Sanırım burada farklı bir sorunu çözmeye çalışıyorsunuz. (Ve daha önce yorum yaparken bunu fark etmemiştim.) Bu olası bir sorun değil, ama sonunda sorulan soru ile biraz ilgili. Sizinki, verilen girişle, çıkış dizenizin varsayılan parametreden 23daha uzun karakterler ve sonekteki karakterler olması gibi garip bir etkiye sahiptir . Bu tuhaf görünüyor. 174" ..."
Scott Sauyet

Bunun daha basit bir uygulama kullanabileceğini düşünüyorum .
Scott Sauyet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.