Создать список элементов с префиксом 0, используя padStart - PullRequest
0 голосов
/ 10 сентября 2018

Я реализовал способ создания списка элементов с повторяемыми значениями с префиксом 0. Каков наилучший способ создания такого рода списка?

Текущее поведение:

const generateList = (length, n, i) => {
let b = n+i

return b.toString().padStart(length.toString().length + n.toString.length, 0)
}

Array(10).fill(null).map((x, i) => generateList(10,2, i))

Результат вывода:

["002", "003", "004", "005", "006", "007", "008", "009", "010", "011"]

У тебя есть идея сделать это по-другому?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

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

function createList(startValue, endValue) {
  let 
    // The minimum output length, for a single digit number, is 2 chars.
    outputLength = 2,
    testValue = 10,
    // Create an empty array which has as many items as numbers we need to
    // generate for the output. Add 1 to the end value as this is to be 
    // inclusive of the range to create. If the +1 is not done the resulting 
    // array is 1 item too small.
    emptyArray = Array(endValue - startValue + 1);
    
  // As long as test value is less than the end value, keep increasing the 
  // output size by 1 and continue to the next multiple of 10.
  while (testValue <= endValue) {
    outputLength++;
    testValue = testValue * 10;
  }
  
  // Create a new array, with the same length as the empty array created
  // earlier. For each position place a padded number into the output array.
  return Array.from(emptyArray, (currentValue, index) => {
    // Pad the current value to the determined max length.
    return (startValue + index).toString().padStart(outputLength, '0');
  });
}

function createListWithLength(length, startValue = 0) {
  return createList(startValue, startValue + length);
}

console.log(createList(2,10));
console.log(createListWithLength(30));
console.log(createListWithLength(10, 995));
0 голосов
/ 10 сентября 2018

Посмотрите на генераторы:

function* range(from, to) {
  for (var i=from; i<to; i++)
    yield i;
}
function* paddedRange(from, to) {
  const length = (to-1).toString(10) + 1 /* at least one pad */;
  for (const i of range(from, to))
    yield i.padStart(length, '0');
}

console.log(Array.from(paddedRange(2, 12)));

Вы также можете встроить цикл из range в paddedRange или сделать так, чтобы он возвращал массив напрямую:

function paddedRange(from, to) {
  const length = (to-1).toString(10) + 1 /* at least one pad */;
  return Array.from(range(from, to), i => i.padStart(length, '0'));
}

console.log(paddedRange(2, 12));

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

0 голосов
/ 10 сентября 2018

Не уверен, но возможно что-то вроде этого

const generateList = length => Array(length).fill('0').map((item, index) => item + index);

console.log(generateList(20));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...