Привет, я нашел решение проблемы на CodeWars, и я не уверен, что делает часть синтаксиса. Функция принимает строку символов и в зависимости от длины возвращает ее определенным образом.

Input = "abcd"; output = "A-Bb-Ccc-Dddd" input = "gFkLM"; выход = "G-Ff-Kkk-Llll-Mmmmm"

Этот парень опубликовал это решение

function accum(str) {
  var letters = str.split('');
  var result = [];
  for (var i = 0; i < letters.length; i++) {
    result.push(letters[i].toUpperCase() + Array(i + 1).join(letters[i].toLowerCase()));
  }
  return result.join('-');
}

В общем, что-то не так с решением, но меня особенно беспокоит одна вещь. Видишь это Array(i + 1)? Что это делает? Извините, Google не очень легкая вещь.

2
Mark Romano 13 Янв 2017 в 08:11

4 ответа

Лучший ответ

Я считаю, что это выделяет массив длины i + 1. Но что более важно, что делает код? Вы должны знать, что делает функция join() ... Она объединяет элементы в массиве, разделенном аргументом функции. Например:

['one', 'two', 'three'].join(' ') === 'one two three'

В этом случае массив заполнен undefined элементами, поэтому вы получите что-то вроде этого:

[undefined].join('a') === ''
[undefined, undefined].join('b') === 'b'
[undefined, undefined, undefined].join('c') === 'cc'
[undefined, undefined, undefined, undefined].join('d') === 'ddd'
6
dana 13 Янв 2017 в 05:47

Я только что проверил

let x= Array(3);
console.log(x);

Выводом является [undefined, undefined, undefined]

Таким образом, он фактически создает массив размером 3 со всеми элементами как неопределенными. Когда мы вызываем join с символом как param, он создает строку с тем же символом, повторяющуюся 2 раза, т.е. (3-1).

console.log(x.join('a')); //  logs aa
1
Rafique Ahmed 13 Янв 2017 в 05:31

Прокомментированный код прохождения ....

function accum(str) {
    /* converts string to character array.*/
    var letters = str.split('');
    /* variable to store result */
    var result = [];
    /* for each character concat (1.) + (2.) and push into results.
       1. letters[i].toUpperCase() :
            UPPER-CASE of the character.
       2. Array(i + 1).join(letters[i].toLowerCase()) :
            create an array with EMPTY SLOTS of length that is, +1 than the current index. 
            And join them to string with the current charater's LOWER-CASE as the separator.

            Ex:
            Index   |   ArrayLength, Array      |   Separator   |   Joined String
            0           1, [null]                   'a'             ''
            1           2, [null,null]              'b'             'b'
            2           3, [null,null,null]         'c'             'cc'
            3           4, [null,null,null,null]    'd'             'ddd'

            NOTE: 
            Join on an array with EMPTY SLOTS, inserts the seperator inbetween the slot values.
            Meaning, if N is the length of array. Then there will be N-1 seperators inserted into the joined string

    */
    for (var i = 0; i < letters.length; i++) {
        result.push(letters[i].toUpperCase() + Array(i + 1).join(letters[i].toLowerCase()));
    }

    /* finally join all sperated by '-' and return ...*/
    return result.join('-');
}
0
Thirueswaran Rajagopalan 13 Янв 2017 в 05:44

Таким образом, в начале для оператора я начинаю с 0. Теперь, если вы войдете в оператор for, где он говорит, что i + 1, я был бы 1. А затем, когда цикл for обновится, и i будет равен 1, i + 1 внутри цикл for будет равен 2. Этот процесс будет продолжаться для длины строки. Надеюсь это поможет.

1
Fahad Ashraf 13 Янв 2017 в 05:19