2014-12-22 2 views
3

Вид странного запроса, я знаю. Но я давно искал решение этого. Это эффект Я ищу:Рандомизируйте верхний или нижний регистр на всех строковых символах

var myString = "Hello I am randomly capitalized" 

Желаемая функция результат:

hElLO i aM rAnDOmlY caPiTAlizED 

Я полагаю, это лучше всего сделать с яваскрипта массивами в той или иной форме. Просто ищу некоторые творческие идеи. Спасибо!

+2

Пожалуйста, разместите код, который вы пробовали. – j08691

ответ

7

Вот один из способов

myString.split('').map(function(c){ 
    return c[Math.round(Math.random())?'toUpperCase':'toLowerCase'](); 
}).join(''); 

Вы можете добавить это в качестве способа-прототипа на строковый объект для легкого доступа при желании:

String.prototype.toRandomCase = function() { 
    return this.split('').map(function(c){ 
     return c[Math.round(Math.random())?'toUpperCase':'toLowerCase'](); 
    }).join(''); 
} 

Тогда доступ

console.log(myString.toRandomCase()); 

Немного бывшего как это работает:

  1. String.split метод используется для разделения строки на массив отдельных символов.
  2. Array.map функция используется. Это принимает функцию обратного вызова, которая применяется к каждому элементу в массиве, и возвращает новый результирующий массив с каждым значением, возвращаемым функцией карты.
  3. Внутри функции карты
    1. Math.round(Math.random()) используется для хаотичности
    2. Результат, который используется с тройным оператором, чтобы получить toLowerCase или toUpperCase Math.Round(Math.random())?'toLowerCase':'toUpperCase'
    3. В результате тройного оператора используется для доступа к соответствующее свойство функции путем отсрочки массива символа, а затем вызванного. c[<ternary here>]()
  4. Наконец он использует метод Array.join по результату вызова в map функции, чтобы присоединиться результирующий массив обратно в строку.

код гольф (КПД)

ответ RobG имеет более эффективный подход, чем мой (пожалуйста upvote свой ответ)

String.prototype.toRandomCase = function() { 
    return this.toLowerCase().split('').map(function(c){ 
     return Math.random() < .5? c : c.toUpperCase(); 
    }).join(''); 
} 

Если у кого есть предложения по улучшению этого дальше - пожалуйста, комментарий или редактировать эта часть ответа

+0

Отлично. Позволь мне дать этому вихрь. Спасибо! – toad

+0

Хммм - это было бы интересно для игры в гольф! –

+0

Вместо 'Math.round' вы можете использовать' .5> ', что меньше, чем тип и еще один вызов функции. – RobG

4

Ну, на основе ответа Джоэла ...

myString.toLowerCase().split('').map(function(c){ 
    return Math.random() < .5? c : c.toUpperCase(); 
}).join(''); 
Смежные вопросы