Вызов значения троичного оператора в 1 строке

#javascript #conditional-operator

#javascript #условный оператор

Вопрос:

У меня есть этот троичный оператор

 function digPow(n, p){
  return Number.isInteger(("" n).split("").map((num,index) => Math.pow(parseInt(num),(p index))).reduce((a, b) => a   b, 0)/n) ? ("" n).split("").map((num,index) => Math.pow(parseInt(num),(p index))).reduce((a, b) => a   b, 0)/n : -1;
}  

Как вы можете видеть, это очень длинный 1 строка. Мой вопрос в том, как мне вспомнить значение внутри числа.isInteger() так что мне не нужно повторять это снова для троичного оператора только в 1 строке.

Это код, из которого мне нужно значение:-

     ("" n).split("").map((num,index) => Math.pow(parseInt(num),(p index)))
      .reduce((a, b) => a   b, 0)/n 
  

Есть ли какой-либо синтаксис для этого? Я относительно новичок в JS

РЕДАКТИРОВАТЬ: на самом деле главный вопрос: «Возможно ли вызвать значение изнутри троичного оператора без использования переменной»

РЕДАКТИРОВАТЬ-2: Извините за мое плохое кодирование. Вот более простой способ задать мой вопрос

 const x = 6
const y = 3
console.log(Number.isInteger(x y/3) ? x y/3 : -1)  

Можно ли вызвать значение x y / 3 без его повторения или создания новой переменной?

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

1. вы можете заменить Math.pow(3, 4) на 3 ** 4 вы также можете заменить parseInt(num) на num в большинстве случаев.

2. Что этот код вообще пытается здесь сделать?

3. То, что вы можете что-то сделать в одной строке, не означает, что вы должны это делать. Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям.

4. многие разработчики не знают о meta или других ветвях SO и публикуют свои вопросы здесь. я бы сказал, что мы не должны судить слишком быстро: D

5. Прошу прощения у всех, кто запутался из-за моего вопроса, пожалуйста, посмотрите на редактирование 2 для более четкого вопроса. Прошу прощения…

Ответ №1:

Не совсем уверен, что делает ваша функция или какие аргументы она должна принимать, но вы могли бы использовать самоисполняющуюся анонимную функцию, известную как IIFE (немедленно вызываемое выражение функции).

Давайте начнем с форматирования того, что у вас есть в данный момент:

 const digPow = (n, p) => Number.isInteger(
  (""   n)
  .split("")
  .map((num, index) => Math.pow(parseInt(num), (p   index)))
  .reduce((a, b) => a   b, 0) / n
)
  ? (""   n)
    .split("")
    .map((num, index) => Math.pow(parseInt(num), (p   index)))
    .reduce((a, b) => a   b, 0) / n
  : -1;
    
console.log(digPow(6, 3)); // 36  

Похоже, что эта часть находится внутри условия, а также возвращает значение, если результат является целым числом:

 (""   n)
  .split("")
  .map((num, index) => Math.pow(parseInt(num), (p   index)))
  .reduce((a, b) => a   b, 0) / n
  

Вы можете свести свою логику к следующему (псевдокод):

 const digPow = (x => Number.isInteger(x) ? x : -1)(split/map/reduce/divide);
  

Давайте передадим это в IIFE:

 const digPow = (n, p) => (
  (value) => Number.isInteger(value) ? value : -1)
  ((""   n)
    .split("")
    .map((num, index) => Math.pow(parseInt(num), (p   index)))
    .reduce((a, b) => a   b, 0) / n);
    
console.log(digPow(6, 3)); // 36  

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

1. Вау, это на самом деле блестяще. Спасибо :).