JavaScript уменьшить - разделить аккумулятор на несколько переменных - PullRequest
0 голосов
/ 26 августа 2018

Почему t становится undefined во второй итерации?

function findShortest(s){
 const arr = s.split(' ');
  
 arr.reduce(([acc, t], curr, idx) => {
  console.log('t', t)

  if (curr.length < t.length) {
      // some code
      t = curr;
    } else { 
      // some code
    }
    return acc;
  }, [[], '']);
  
  return arr;
  
}

console.log(findShortest('how are you doing this wonderfull coding man'));

Я пытаюсь отфильтровать самые короткие слова из массива за одну итерацию, поэтому мне не нужно зацикливать массив, чтобы получить самое короткое слово, а затем снова отфильтровать его.Вы можете увидеть, что было моей первой попыткой.Я в конечном итоге с этим:

 const arr = s.split(' ');
  
 let shortest = 50;
  
 return arr.reduce((acc, curr) => {
  	if (curr.length < shortest) {
    	acc = [];
      acc.push(curr);
      shortest = curr.length;
    } else if (curr.length === shortest) {
       acc.push(curr);
    }
    return acc;
  }, []);

Но почему при первом подходе t становится неопределенным?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Подход сводится к объекту, где ключи - это длины, а значения - это массивы слов одинаковой длины.

function findShortest(s) {
  const wordsObj = s
    .split(' ')
    .reduce((acc, curr) => {
      const len = curr.trim().length;
      if (len) {       
        acc[len] = (acc[len] || []).concat(curr);      
      }
      return acc;
    }, {});

  return wordsObj[Math.min(...Object.keys(wordsObj))]
}

console.log(findShortest('how are you doing this wonderfull coding man'));
0 голосов
/ 26 августа 2018

Вы можете взять массив в качестве набора результатов и проверить длину первой собранной строки.При запуске проверьте, существует ли аккумулятор.

function findShortest(s) {
   return s
       .split(' ')
       .reduce((acc, curr) => {
           if (!acc || curr.length < acc[0].length) {
               return [curr];
           }
           if (curr.length === acc[0].length) {
               acc.push(curr);
           }
           return acc;
       }, undefined);
}

console.log(findShortest('how are you doing this wonderfull coding man'));
...