Bir harfi büyütme yöntemi sunan bir Javascript kitaplığı (ör. Alt çizgi, jQuery, MooTools, vb.) Bilen var mı?
Şunun gibi bir şey yapabilmek isterim:
"a"++; // would return "b"
Bir harfi büyütme yöntemi sunan bir Javascript kitaplığı (ör. Alt çizgi, jQuery, MooTools, vb.) Bilen var mı?
Şunun gibi bir şey yapabilmek isterim:
"a"++; // would return "b"
Yanıtlar:
function nextChar(c) {
return String.fromCharCode(c.charCodeAt(0) + 1);
}
nextChar('a');
Diğerlerinin de belirttiği gibi, dezavantajı, 'z' harfi gibi durumları beklendiği gibi ele alamayabilir. Ama ondan ne istediğine bağlı. Yukarıdaki çözüm, 'z'den sonraki karakter için' {'döndürecektir ve bu ASCII'de' z'den sonraki karakterdir, bu nedenle kullanım durumunuza bağlı olarak aradığınız sonuç bu olabilir.
(Güncellenme tarihi 2019/05/09)
Bu yanıt çok fazla görünürlük kazandığından, Google'dan bu konuda tökezleyen kişilere potansiyel olarak yardımcı olmak için, orijinal sorunun kapsamının biraz ötesine geçmeye karar verdim.
Sık sık istediğim şeyin, belirli bir karakter setinde (yalnızca harf kullanmak gibi) sıralı, benzersiz dizeler üretecek bir şey olduğunu buldum, bu yüzden bu yanıtı, burada bunu yapacak bir sınıfı içerecek şekilde güncelledim:
class StringIdGenerator {
constructor(chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
this._chars = chars;
this._nextId = [0];
}
next() {
const r = [];
for (const char of this._nextId) {
r.unshift(this._chars[char]);
}
this._increment();
return r.join('');
}
_increment() {
for (let i = 0; i < this._nextId.length; i++) {
const val = ++this._nextId[i];
if (val >= this._chars.length) {
this._nextId[i] = 0;
} else {
return;
}
}
this._nextId.push(0);
}
*[Symbol.iterator]() {
while (true) {
yield this.next();
}
}
}
Kullanım:
const ids = new StringIdGenerator();
ids.next(); // 'a'
ids.next(); // 'b'
ids.next(); // 'c'
// ...
ids.next(); // 'z'
ids.next(); // 'A'
ids.next(); // 'B'
// ...
ids.next(); // 'Z'
ids.next(); // 'aa'
ids.next(); // 'ab'
ids.next(); // 'ac'
Ya verilen harf z ise? İşte daha iyi bir çözüm. A, B, C ... X, Y, Z, AA, AB, ... vb. Gider. Temelde bir Excel elektronik tablosunun sütun kimlikleri gibi harfleri artırır.
nextChar ('yz'); // "ZA" döndürür
function nextChar(c) {
var u = c.toUpperCase();
if (same(u,'Z')){
var txt = '';
var i = u.length;
while (i--) {
txt += 'A';
}
return (txt+'A');
} else {
var p = "";
var q = "";
if(u.length > 1){
p = u.substring(0, u.length - 1);
q = String.fromCharCode(p.slice(-1).charCodeAt(0));
}
var l = u.slice(-1).charCodeAt(0);
var z = nextLetter(l);
if(z==='A'){
return p.slice(0,-1) + nextLetter(q.slice(-1).charCodeAt(0)) + z;
} else {
return p + z;
}
}
}
function nextLetter(l){
if(l<90){
return String.fromCharCode(l + 1);
}
else{
return 'A';
}
}
function same(str,char){
var i = str.length;
while (i--) {
if (str[i]!==char){
return false;
}
}
return true;
}
// below is simply for the html sample interface and is unrelated to the javascript solution
var btn = document.getElementById('btn');
var entry = document.getElementById('entry');
var node = document.createElement("div");
node.id = "node";
btn.addEventListener("click", function(){
node.innerHTML = '';
var textnode = document.createTextNode(nextChar(entry.value));
node.appendChild(textnode);
document.body.appendChild(node);
});
<input id="entry" type="text"></input>
<button id="btn">enter</button>
if (same(u,'Z')){
için if (u == 'Z'){
, ve o inşaat mükemmel teşekkürler!
same(str,char)
buraya yapıştırılmamış olmasıydı? Bilmiyorum.
same()
, açıkça özel bir işlev. Oh iyi, ==
işe yarıyor ve çok emin olmak istersem kullanabilirdim ===
, ama test ettim ve sorun değil. Tekrar teşekkürler!
Olası bir yol aşağıda tanımlandığı gibi olabilir
function incrementString(value) {
let carry = 1;
let res = '';
for (let i = value.length - 1; i >= 0; i--) {
let char = value.toUpperCase().charCodeAt(i);
char += carry;
if (char > 90) {
char = 65;
carry = 1;
} else {
carry = 0;
}
res = String.fromCharCode(char) + res;
if (!carry) {
res = value.substring(0, i) + res;
break;
}
}
if (carry) {
res = 'A' + res;
}
return res;
}
console.info(incrementString('AAA')); // will print AAB
console.info(incrementString('AZA')); // will print AZB
console.info(incrementString('AZ')); // will print BA
console.info(incrementString('AZZ')); // will print BAA
console.info(incrementString('ABZZ')); // will print ACAA
console.info(incrementString('BA')); // will print BB
console.info(incrementString('BAB')); // will print BAC
// ... and so on ...
Bunu deneyebilirsin
console.log( 'a'.charCodeAt(0))
Önce Ascii sayısına çevirin .. Artırın .. sonra Ascii'den char'a çevirin ..
var nex = 'a'.charCodeAt(0);
console.log(nex)
$('#btn1').on('click', function() {
var curr = String.fromCharCode(nex++)
console.log(curr)
});
FIDDLE'ı kontrol edin
Harf dizilerini birden çok kez kullanmam gerekti ve bu işlevi bu SO sorusuna göre yaptım. Umarım bu başkalarına yardımcı olabilir.
function charLoop(from, to, callback)
{
var i = from.charCodeAt(0);
var to = to.charCodeAt(0);
for(;i<=to;i++) callback(String.fromCharCode(i));
}
Bu nasıl kullanılır:
charLoop("A", "K", function(char) {
//char is one letter of the sequence
});
Tüm bu cevapların üzerine ek olarak:
// first code on page
String.prototype.nextChar = function(i) {
var n = i | 1;
return String.fromCharCode(this.charCodeAt(0) + n);
}
String.prototype.prevChar = function(i) {
var n = i | 1;
return String.fromCharCode(this.charCodeAt(0) - n);
}
Bu iyi çalışıyor:
var nextLetter = letter => {
let charCode = letter.charCodeAt(0);
let isCapital = letter == letter.toUpperCase();
if (isCapital == true) {
return String.fromCharCode((charCode - 64) % 26 + 65)
} else {
return String.fromCharCode((charCode - 96) % 26 + 97)
}
}
EXAMPLES
nextLetter("a"); // returns 'b'
nextLetter("z"); // returns 'a'
nextLetter("A"); // returns 'B'
nextLetter("Z"); // returns 'A'
Sadece gülmek için bir çözüm
function nextLetter(str) {
const Alphabet = [
// lower case alphabet
"a", "b", "c",
"d", "e", "f",
"g", "h", "i",
"j", "k", "l",
"m", "n", "o",
"p", "q", "r",
"s", "t", "u",
"v", "w", "x",
"y", "z",
// upper case alphabet
"A", "B", "C",
"D", "E", "F",
"G", "H", "I",
"J", "K", "L",
"M", "N", "O",
"P", "Q", "R",
"S", "T", "U",
"V", "W", "X",
"Y", "Z"
];
const LetterArray = str.split("").map(letter => {
if (Alphabet.includes(letter) === true) {
return Alphabet[Alphabet.indexOf(letter) + 1];
} else {
return " ";
}
});
const Assemble = () => LetterArray.join("").trim();
return Assemble();
}
console.log(nextLetter("hello*3"));
Bu gerçekten eski. Ancak bu işlevselliğe ihtiyacım vardı ve çözümlerin hiçbiri kullanım durumum için ideal değil. A, b, c ... z, aa, ab ... zz, aaa ... oluşturmak istedim. Bu basit özyineleme işi yapar.
function nextChar(str) {
if (str.length == 0) {
return 'a';
}
var charA = str.split('');
if (charA[charA.length - 1] === 'z') {
return nextID(str.substring(0, charA.length - 1)) + 'a';
} else {
return str.substring(0, charA.length - 1) +
String.fromCharCode(charA[charA.length - 1].charCodeAt(0) + 1);
}
};
Bir kapanışta {a: 'b', b: 'c', vb} ile bir işlev yapın: -
let nextChar = (s => (
"abcdefghijklmopqrstuvwxyza".split('')
.reduce((a,b)=> (s[a]=b, b)), // make the lookup
c=> s[c] // the function returned
))({}); // parameter s, starts empty
kullanım: -
nextChar('a')
Büyük harf ve rakam ekleme: -
let nextCh = (
(alphabeta, s) => (
[alphabeta, alphabeta.toUpperCase(), "01234567890"]
.forEach(chars => chars.split('')
.reduce((a,b) => (s[a]=b, b))),
c=> s[c]
)
)("abcdefghijklmopqrstuvwxyza", {});
ps Javascript'in bazı sürümlerinde, [...chars]
bunun yerine kullanabilirsiniz .chars.split('')
Https://stackoverflow.com/a/28490254/881441 adresinde sunduğum rot13 algoritmasının bir varyasyonu :
function rot1(s) {
return s.replace(/[A-Z]/gi, c =>
"BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza"[
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(c) ] )
}
Alttaki giriş kodu ve aranan kodek üsttedir (yani çıkış kodu giriş koduyla aynıdır, ancak 1 kaydırılmıştır). İşlev yalnızca harfleri değiştirir, yani başka bir karakter aktarılırsa, bu kodek tarafından değiştirilmez.
function charLoop(from, to, callback) {
var i = from.charCodeAt(0);
var to = to.charCodeAt(0);
for (; i <= to; i++) {
callback(String.fromCharCode(i));
}
}
var sequence = "";
charLoop("A", "Z", function (char) {
sequence += char + " ";
});
sequence = sequence.trim();
sequence = sequence.split(" ");
var resseq = sequence;
var res = "";
var prevlet = "";
var nextlet = "";
for (b = 0; b < resseq.length; b++) {
if (prevlet != "") {
prevlet = resseq[b];
}
for (a = 0; a < sequence.length; a++) {
for (j = 1; j < 100; j++) {
if (prevlet == "") {
prevlet = sequence[a];
nextlet = sequence[a + 1];
res += sequence[a] + sequence[a] + 0 + j + " ";
}
else {
if (j < 10) {
res += prevlet + sequence[a] + 0 + j + " ";
}
else {
res += prevlet + sequence[a] + j + " ";
}
}
}
}
}
document.body.innerHTML = res;
@Nathan wall cevap artışına ve azalmasına göre
// Albhabet auto increment and decrement
class StringIdGenerator {
constructor(chars = '') {
this._chars = chars;
}
next() {
var u = this._chars.toUpperCase();
if (this._same(u,'Z')){
var txt = '';
var i = u.length;
while (i--) {
txt += 'A';
}
this._chars = txt+'A';
return (txt+'A');
} else {
var p = "";
var q = "";
if(u.length > 1){
p = u.substring(0, u.length - 1);
q = String.fromCharCode(p.slice(-1).charCodeAt(0));
}
var l = u.slice(-1).charCodeAt(0);
var z = this._nextLetter(l);
if(z==='A'){
this._chars = p.slice(0,-1) + this._nextLetter(q.slice(-1).charCodeAt(0)) + z;
return p.slice(0,-1) + this._nextLetter(q.slice(-1).charCodeAt(0)) + z;
} else {
this._chars = p+z;
return p + z;
}
}
}
prev() {
var u = this._chars.toUpperCase();
console.log("u "+u)
var l = u.slice(-1).charCodeAt(0);
var z = this._nextLetter(l);
var rl = u.slice(1)
var y = (rl == "A") ? "Z" :this._prevLetter(rl.charCodeAt(0))
var txt = '';
var i = u.length;
var j = this._chars
var change = false
while (i--) {
if(change){
if (u[u.length-1] == "A"){
txt += this._prevLetter(u[i].charCodeAt(0))
}else{
txt += u[i]
}
}else{
if (u[u.length-1] == "A"){
txt += this._prevLetter(u[i].charCodeAt(0))
change = true
}else{
change = true
txt += this._prevLetter(u[i].charCodeAt(0))
}
}
}
if(u == "A" && txt == "Z"){
this._chars = ''
}else{
this._chars = this._reverseString(txt);
}
console.log(this._chars)
return (j);
}
_reverseString(str) {
return str.split("").reverse().join("");
}
_nextLetter(l){
if(l<90){
return String.fromCharCode(l + 1);
}
else{
return 'A';
}
}
_prevLetter(l){
if(l<=90){
if(l == 65) l = 91
return String.fromCharCode(l-1);
}
else{
return 'A';
}
}
_same(str,char){
var i = str.length;
while (i--) {
if (str[i]!==char){
return false;
}
}
return true;
}
}
Kullanım
const ids = new StringIdGenerator();
ids.next();
ids.prev();