отдельная длина строки в массиве JavaScript - PullRequest
0 голосов
/ 04 февраля 2019

Мне нужно создать функцию, которая принимает четыре строки и возвращает массив, содержащий длину каждой строки.Мне дали следующее:

function stringLengths(str1, str2, str3, str4) {
  //
}

Я создал массив строк и искал в Google так долго, что все слова начинают выглядеть одинаково.

Ответы [ 5 ]

0 голосов
/ 17 февраля 2019

Уже есть отличные ответы, чтобы stringLengths работал с любым количеством параметров.Однако все (пока) предполагают, что каждый параметр является строкой.

, что может привести к неожиданным результатам:

  • И массивы, и функции имеют свойство length
  • Любые объекты могут быть обработаны с помощью свойства length

Или даже ошибок:

  • Такие вещи, как null или undefined вызовут ошибку, когдапытается прочитать свойства из них.

const stringLengths = (...strs) =>
  strs.map(s => s.length);

console.log(
  stringLengths(1, 2)
);

console.log(
  stringLengths({length: '?'}, ['?'], (a, b) => '?')
);

console.log(
  stringLengths(null, null)
);

Вы можете написать декоратор filterStrings, который можно применить к stringLengths, чтобы он получал только строки:

const stringLengths = (...strs) =>
  strs.map(s => s.length);

const filterStrings = fn => (...args) =>
  fn(...args.filter(arg => typeof arg === 'string'));
  
const safeStringLengths = filterStrings(stringLengths);

console.log(
  safeStringLengths(1, 2)
);

console.log(
  safeStringLengths({length: '?'}, ['?'], (a, b) => '?')
);

console.log(
  safeStringLengths(null, null)
);

console.log(
  safeStringLengths("foo", "bar", "foobar")
);

filterStrings - это функция, которая фактически получает все параметры, сохраняет только строки и передает их stringLengths.

Почему так?

Это действительно зависит от вашего контекста.Хорошая особенность декоратора состоит в том, что он позволяет вам переместить проверку параметров за пределы stringLengths и позволить функции делать только одно.

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

0 голосов
/ 04 февраля 2019

Если вы не хотите изменять определение своей функции, вы также можете использовать объект arguments .

function stringLengths(str1, str2, str3, str4)
{    
    return [...arguments].map(x => x.length);
}

console.log(stringLengths("hello", "cruel", "world", "of", "darkness"));

Или вот так:

function stringLengths(str1, str2, str3, str4)
{    
    return Object.values(arguments).map(x => x.length);
}

console.log(stringLengths("hello", "cruel", "world", "of", "darkness"));
0 голосов
/ 04 февраля 2019

вот ваш код

function stringLengths(str1, str2, str3, str4) { 
  return [str1.length, str2.length, str3.length, str4.length]
}

console.log(stringLengths('1','bb','ccc','dddd'))
0 голосов
/ 04 февраля 2019

Вы можете использовать синтаксис rest и функцию .map(), чтобы получить массив длины строки:

const stringLengths = (...str) => str.map(({ length }) => length);

console.log(stringLengths('lorem', 'ipsum'));
console.log(stringLengths('lorem', 'ipsum', 'sit', 'amet'));
0 голосов
/ 04 февраля 2019

Вы можете использовать Rest Paremeters для преобразования аргументов в массив, а затем map их для получения требуемого результата.Ниже мой фрагмент.

function stringLengths(...strings){
  return strings.map(string => string.length);
}
console.log(stringLengths("","something","something else"))
...