#javascript #arrays #repeat #indexof
#javascript #массивы #повторить #indexof
Вопрос:
Мне нужно повторить каждую букву в массиве букв таким образом: например [a, b, c, d] => a, bb, ccc, dddd
Я предполагаю, что с этой частью что-то не так: splitStr.indexOf(x) 1)
Не могли бы вы, пожалуйста, взглянуть и дать мне подсказку о том, что здесь не так? Спасибо. (Конечный результат должен быть A-Bb-Ccc-Dddd в виде строки)
function accum(s) {
var splitStr = s.toLowerCase().split('') // [a, b, c, d]
var arr = splitStr.map(x => x.repeat(splitStr.indexOf(x) 1)) // [a, bb, ccc, ddd]
arr = arr.map(a => a.slice(0, 1).toUpperCase() a.slice(1).toLowerCase())
return arr.join('-')
}
console.log(accum('abcd'))
Комментарии:
1. Ваш фрагмент кажется нормальным, результат
A-Bb-Ccc-Dddd
?2. Вы можете использовать второй параметр обратного вызова
map
:.map((x, i) => x.repeat(i 1))
Ответ №1:
Используйте аргумент index в map()
обратном вызове и сохраните его для повторного поиска в массиве.
Вы также можете объединить это в одно map()
вместо двух
function accum(s) {
var splitStr = s.toLowerCase().split('') // [a, b, c, d]
var arr = splitStr.map((x, i) => x.toUpperCase() x.repeat(i));
return arr.join('-')
}
console.log(accum('abcd'))
Комментарии:
1. О! Большое спасибо! Теперь я понимаю, что я должен был там сделать. А также спасибо, что показали мне, как я мог бы объединить эти два map () в один.
Ответ №2:
Вы можете использовать index
аргумент (второй) обратного вызова Array.map() и сэкономить производительность, также используя верхний регистр внутри первого map()
.
function accum(s)
{
var splitStr = s.toLowerCase().split('');
var arr = splitStr.map((x, idx) => x.toUpperCase() x.repeat(idx));
return arr.join('-')
}
console.log(accum('abcd'));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
В качестве альтернативы, вы можете сделать то же самое, используя String.replace() и функцию замены:
function accum(s)
{
return s.toLowerCase().replace(/./g, (match, offset) =>
{
let token = offset < s.length - 1 ? "-" : "";
return match.toUpperCase() match.repeat(offset) token;
});
}
console.log(accum('abcd'));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Ответ №3:
Вы можете использовать repeat(). Он возвращает новую строку, которая содержит указанное количество копий строки, для которой он был вызван, объединенных вместе.
var list = ['a', 'b', 'c', 'd'];
var result = Array.from(list, (v, i) => {
let value = v.repeat(i 1);
return value.charAt(0).toUpperCase() value.slice(1)
}).join('-');
console.log(result);
Ответ №4:
Вы можете сопоставить и объединить следующим образом:
var s = 'AbCd';
var array1 = s. toLowerCase().split(''); //['a','b','c','d'];
const map1 = array1.map((x, index) => x.toUpperCase() x.repeat(index)).join('-');
console.log(map1);
Комментарии:
1. Я не голосовал за это, но, возможно, люди проголосовали против ответа, который для всех практических целей идентичен тому, который был опубликован несколькими минутами ранее. Почему бы просто не проголосовать за charlietfl, если это правильный путь?
2. Может быть, именно поэтому. Я опубликовал свой, прежде чем обновить и увидеть его. Просто не потрудился проверить его постфактум, а затем, в свою очередь, удалить мой после выявления сходств. Это стандартный протокол?
3. @MarkMeyer Первая версия ответа, на который вы ссылаетесь, предусматривает только использование
index
приmap()
обратном вызове, он отредактировал его после улучшения, в то время как моя первая версия и эта рассматривают также другие вещи. Итак, я вынужден быстро ответить, чтобы получить голоса? Также иногда, когда вы даете ответ, вы не смотрите, приходят ли новые. Я не думаю, что это хорошая причина для понижения голоса, если между ответами не проходит более 10 или 15 минут.4. @Shidersz это была всего лишь гипотеза.