Javascript Для L oop Рефакторинг в соответствии с правилами и рекомендациями ESLint - PullRequest
1 голос
/ 26 апреля 2020

Мне нужна помощь в реорганизации моего кода в соответствии с передовыми методами ES6 и в соответствии с приведенными ниже правилами ESLinting. Ниже весь мой метод. Для l oop вот проблема.

formatNumber(val) {
  if (!isFinite(val)) {
    return val;
  }
  const valFloat = val.toString();
  const decPos = valFloat.indexOf('.');
  const intPart = (decPos === -1) ? valFloat : valFloat.substr(0, decPos);
  const formattedNum = [];
  // this needs refactoring
  for (const ii in intPart) {
    if (ii % 3 === 0 && ii !== 0) {
      formattedNum.push();
    }
    formattedNum.push(intPart[intPart.length - 1 - ii]);
  }
  formattedNum.reverse();

  return (decPos === -1) ? formattedNum.join('') : formattedNum.join('') + valFloat.slice(decPos, valFloat.length);
}
ESLint: The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype.(guard-for-in)
ESLint: for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.(no-restricted-syntax)

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Ваша текущая предлагаемая программа только «форматирует» число на основе (предположительно) вашей локали. Мой совет не исправить программу, которая находится на неправильном пути полностью. Рассмотрим Number.prototype.toLocaleString , и необходимость в вашей функции formatNumber исчезнет -

num.toLocaleString([locales [, options]])

При использовании параметра locales -

var number = 123456.789;

// German uses comma as decimal separator and period for thousands
console.log(number.toLocaleString('de-DE'));
// → 123.456,789

// Arabic in most Arabic speaking countries uses Eastern Arabic digits
console.log(number.toLocaleString('ar-EG'));
// → ١٢٣٤٥٦٫٧٨٩

// India uses thousands/lakh/crore separators
console.log(number.toLocaleString('en-IN'));
// → 1,23,456.789

// the nu extension key requests a numbering system, e.g. Chinese decimal
console.log(number.toLocaleString('zh-Hans-CN-u-nu-hanidec'));
// → 一二三,四五六.七八九

// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian
console.log(number.toLocaleString(['ban', 'id']));
// → 123.456,789

Использование параметра options -

var number = 123456.789;

// request a currency format
console.log(number.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' }));
// → 123.456,79 €

// the Japanese yen doesn't use a minor unit
console.log(number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }))
// → ¥123,457

// limit to three significant digits
console.log(number.toLocaleString('en-IN', { maximumSignificantDigits: 3 }));
// → 1,23,000

// Use the host default language with options for number formatting
var num = 30000.65;
console.log(num.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
// → "30,000.65" where English is the default language, or
// → "30.000,65" where German is the default language, or
// → "30 000,65" where French is the default language
1 голос
/ 26 апреля 2020

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

Проблема с for..in l oop, как описано в документации ESLint . Это правило ESLint требует, чтобы, если вы используете for..in l oop, вы запускали Object.prototype.hasOwnProperty для каждого ключа, чтобы убедиться, что это часть нужного вам объекта, а не из какого-то другого кода, который добавил свойство к Object.prototype (или, в данном случае, также String.prototype). Это разумное защитное кодирование.

Таким образом, вы могли бы сделать это:

for (const ii in intPart) {
  if (!Object.prototype.hasOwnProperty.call(intPart, ii)) {
    continue;
  }
...

Но это для меня не очень хорошее решение, и на самом деле возможно реорганизовать ваш код в более хорошем, более простом для понимания пути, который также решает эту проблему:

const formattedNum = intPart
  .split('') // split the string into an array of digits
  .reduceRight((acc, val, idx) => { // loop through the array with a reducer function, starting at the right
    acc.unshift(val); // add the digit to the beginning of the output array

    if (
      idx && // if it's not the first item in the array (where idx === 0)
      ((intPart.length - idx) % 3 === 0) // and it is a multiple of three from the end of the array
    ) {
      acc.unshift(','); // add a comma to the beginning of the array
    }

    return acc;
}, []);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...