как разделить строку на фрагменты по 2 символа с помощью reduce

#javascript #arrays #string #function #reduce

#javascript #массивы #строка #функция #уменьшить

Вопрос:

Я пытаюсь использовать reduce для получения следующего вывода:

 solution('abcdef') // should return ['ab', 'cd', 'ef']
 

если длина строки нечетная, мы должны преобразовать ее в четную и добавить символ ‘_’ (подчеркивание)

 solution('abc') // should return ['ab', 'c_'] 
 

вот где я нахожусь до сих пор:

  1. моя функция if не работает, не совсем уверен, почему.
  2. Я получаю только до 2 строк, но не могу выйти за их пределы. Я думаю, что я заставляю результат становиться тем, что я хочу, но это не сработает, если у нас есть только 1 символ или 2, верно?
 function solution(str){
 if (str.lenght % 2!==0){str.concat('_')};
 console.log(str)
 const array =  str.split(',');
 
  const reducer = array.reduce((acc, curr, i, arr)=>{
    return [...acc, curr[i] curr[i 1], curr[i 2] curr[i 3]]
  },[])
  
  return reducer
}

solution('helloworl') 

любые подсказки и рекомендации о том, как решить проблему, были бы приятными!
большое спасибо

Комментарии:

1. использование функции reduce усложнит задачу 🙂

Ответ №1:

Это сделает это:

 let splitTwos = (str) => str.match(/w{1,2}/g).map(e => e.length == 2?e:e "_")

console.log(splitTwos("abcde"))
console.log(splitTwos("abcdef")) 

Ответ №2:

Я также думаю, что использование match будет лучше, поскольку вы просили reduce, вот моя реализация

 function solution(str){
    if (str.length % 2 !==0){
        str ='_';
    }

    const strarray =  str.split('');
    temp='';
    let res = strarray.reduce((acc,cur,i,arr)=>{
        if(i%2 === 0){
            temp =arr[i];
            temp =arr[i 1];
            acc.push(temp)
        }
        temp='';
        return acc;
    },[]);
    return res;
}
console.log(solution('helloworl'));
 

Комментарии:

1. Да, согласитесь, что решение для сопоставления потрясающее. Я действительно использовал его, обдумывая проблему, но не смог добавить подчеркивание:(. Большое спасибо за вашу помощь, но, как и в предыдущем предложении, я думаю, что оно не совсем касается подчеркивания четной или нечетной длины, но мне понравилось, как вы решили функцию уменьшения. Это очень ясно!. Я новичок и действительно застрял в поиске решений.

2. Рад быть полезным, это должно сработать, я неправильно написал ‘length’!

Ответ №3:

Ответ Алана Омара, вероятно, лучший способ справиться с этим, но если вы настаиваете на использовании array reduce, вы могли бы сделать это так. Преобразуйте вашу строку в массив из отдельных символов и используйте reduce следующим образом.

Я бы не рекомендовал это, но это отвечает на ваш вопрос.

 function solution(str){
    if (str.length % 2 !== 0){
        str = str.concat('_');
    };

    const arrayOfChars =  str.split('');
 
    const reducer = arrayOfChars.reduce(
        (acc, curr, i, arr) => {
            if(i % 2 !== 0){
                acc[acc.length - 1] = acc[acc.length - 1]   curr;
                return acc;
            }

            return [...acc, curr];
        },
        []
    );
  
    return reducer;
}

solution('helloworl');
 

Комментарии:

1. этот отличный, но проверяющий, по-прежнему не обрабатывает нечетные или четные длины строки для добавления подчеркивания, он добавляет его в обоих случаях. Спасибо, однако, за размышления о фактическом сокращении, очень помогает видеть реализации от других

2. То же, что и в другом ответе, я также неправильно написал length . Я думаю, что мы оба скопировали вашу опечатку