Saya mencoba membalikkan semua kata dengan jumlah karakter 5 atau lebih dalam string yang diberikan.

Ini kode saya:

    function spinWords(string){
  let stringArray = string.split(' ');
  for (var i = 0; i < stringArray.length; i++) {
    if ( stringArray[i].length >= 5) {
      stringArray[i].split('').reverse().join('');
    }
  }
  return stringArray.join(' ');
}

Untuk beberapa alasan, saya mendapatkan hasil yang sama. id menghargai beberapa bantuan.

Sebagai contoh; input: "Saya belajar coding setiap hari" output: "Saya gninrael gnidoc yadyreve"

1
CHRIS EKE 7 Januari 2021, 21:10

3 jawaban

Jawaban Terbaik

Baris stringArray[i].split('').reverse().join('') tidak membalik pada tempatnya tetapi mengembalikan string baru dengan teks yang dibalik. Itu berarti bahwa array itu sendiri tetap sama. Anda perlu mengganti entri di posisi i dengan kata yang dibalik untuk benar-benar mendapatkan kata yang dibalik. Di bawah ini adalah contoh yang diperbarui.

function spinWords(string){
  let stringArray = string.split(' ');
  for (var i = 0; i < stringArray.length; i++) {
    if ( stringArray[i].length >= 5) {
      stringArray[i] = stringArray[i].split('').reverse().join('');
    }
  }
  return stringArray.join(' ');
}

console.log(spinWords("this is a looooong word"))
2
chingucoding 7 Januari 2021, 18:22

Sementara Masheer Ali memasok one-liner langsung, saya pikir itu selalu bernilai setidaknya mempertimbangkan bagaimana memecah persyaratan tersebut menjadi bagian-bagian yang lebih sederhana. Anda mungkin tidak selalu menggunakan perincian seperti itu. Jika bagian-bagian komponen tampaknya tidak berguna dengan sendirinya, mungkin lebih baik untuk memasukkannya ke dalam fungsi utama. Tetapi sering kali itu membuat kode Anda lebih sederhana dan lebih mudah dipahami, dan itu layak dilakukan hanya untuk itu.

Berikut adalah rincian seperti itu:

const spin = (str) => 
  str .split ('') .reverse () .join ('')

const spinLong = (n) => (str) => 
  str .length > n ? spin (str) : str

const spinWords = (str) => 
  str .split (' ') .map (spinLong (5)) .join (' ')

console .log (
  spinWords ('Im learning coding everyday')
)

Kami memiliki tiga fungsi.

  • spin membalikkan satu string. Ia tidak tahu apa-apa tentang kalimat atau batasan "lebih besar dari panjang 5". Itu hanya mengubah sesuatu seperti 'abc x yz' menjadi 'zy x cba'.

  • spinLong hanya membalikkan string panjang, di mana panjangnya diberikan sebagai parameter. Itu saja. Ia tidak tahu bagaimana membalik senar itu sendiri, mendelegasikan pemintalan yang sebenarnya ke fungsi spin. Jadi yang harus dilakukan adalah memutuskan apakah string Anda cukup panjang dan panggil spin jika ya.

  • spinWords memecahkan masalah yang ditanyakan. Itu memutar semua kata dalam kalimat yang panjangnya lebih dari 5 huruf. Tetapi juga tidak tahu cara memutar kata, dan tidak tahu cara memeriksa panjang kata. Itu mendelegasikan perilaku itu ke spinLong. Secara internal ia membagi kalimat menjadi kata-kata, memanggil spinLong (5) pada setiap kata, dan menggabungkannya kembali menjadi sebuah kalimat.

Kita dapat menyelaraskan ini dengan kode yang mirip dengan versi kedua MasheerAli, seperti ini:

const spinWords = (str) => str
  .split (' ') .map ((s) => s .length > 5 ? s .split ('') .reverse () .join ('') : s) .join (' ')

Itu sekarang terlihat kurang menarik bagi saya. Bagaimanapun kami memilih untuk meletakkannya, itu akan tampak lebih seperti sekumpulan langkah daripada seperti deskripsi tentang apa yang ingin kami lakukan. Saya menemukan yang sebelumnya lebih mudah dimengerti.

Tentu saja Anda hampir selalu bisa melangkah lebih jauh dengan gaya ini. Kita dapat mendefinisikan fungsi makeWords yang membagi spasi, dan fungsi makeSentence yang mengembalikan spasi di antara kata-kata. Ini adalah panggilan yang menarik. Saya tidak menganggap ini sangat menarik, tetapi mungkin perlu diselidiki, terutama dalam cara kami merekatkannya.


Oke, sekarang setelah Anda melakukan pekerjaan dengan baik dalam memberikan fungsionalitas penting bisnis ini, bos Anda memberi tahu Anda bahwa ada persyaratan baru yang penting. Untuk beberapa pelanggan, kami hanya akan memutar kata lebih dari 7 karakter. Untuk yang lain, ini jam 12.

Dan Anda harus bergegas keluar dari pintu ini. "Saya membutuhkan ini dalam satu jam. Seberapa cepat Anda bisa menyelesaikannya?" (Kutipan nyata dari bos lama, untuk posisi yang segera saya tinggalkan. Satu jam sebenarnya adalah "Selasa depan", tetapi intinya sama. Bos sepertinya berpikir jadwal kode dapat dibuat dengan mudah oleh fiat.) Masalah besar apakah panggilan ke seluruh sistem sekarang bergantung pada modul spinWords Anda yang cantik. Anda tidak punya waktu untuk mengubah semua panggilan mereka. Tapi Anda tahu bahwa memotong dan menempel adalah ide yang buruk. Anda harus memperbaiki ini di root.

Nah, Anda bisa melakukannya dengan mudah, tanpa copy paste di mana-mana. Kami hanya membutuhkan fungsi baru dengan parameter tambahan, dan refactoring spinWords untuk menggunakannya:

const spinLongWords = (n) => (str) => 
  str .split (' ') .map (spinLong (n)) .join (' ')

const spinWords = spinLongWords (5)

console .log (
  spinWords ('Im learning coding everyday'),         //~> Im gninrael gnidoc yadyreve
  spinLongWords (7) ('Im learning coding everyday'), //~> Im gninrael coding yadyreve
  spinLongWords (12) ('Im learning coding everyday') //~> Im learning coding everyday
)

"Oke, bos. Selesai. Kita dapat memutuskan setelah krisis pemintalan ini berakhir apakah kita ingin mempertahankan fungsi spinWords lama yang hanya menangani kata 5+ huruf sebagai kasus default di seluruh sistem atau memfaktorkan ulang semuanya untuk diganti mereka dengan panggilan langsung ke fungsi spinLongWords baru kami yang mewah. Ini adalah prioritas yang cukup rendah, tetapi harus terdaftar di antara utang teknologi kami sampai kami membuat keputusan dan menerapkannya."

2
Scott Sauyet 7 Januari 2021, 19:47

Dalam javascript jika Anda memanggil metode apa pun pada string, itu tidak mengubahnya tetapi mengembalikan nilai baru. Anda perlu menyimpan nilai itu dalam variabel dan menggunakannya.

function spinWords(string){
  let stringArray = string.split(' ');
  for (var i = 0; i < stringArray.length; i++) {
    if ( stringArray[i].length >= 5) {
      stringArray[i] = stringArray[i].split('').reverse().join('');
    }
  }
  return stringArray.join(' ');
}
console.log(spinWords("Im learning coding everyday"));

Cara yang lebih bagus untuk melakukan hal yang sama adalah dengan menggunakan map() dan filter()

const spinWords = string => string
                              .split(' ')
                              .map(x => x.length >= 5 ? x.split('').reverse().join('') : x )
                              .join(' ');

console.log(spinWords("Im learning coding everyday"));
1
Maheer Ali 7 Januari 2021, 18:25