2017-07-29 91 views
1

我今天一直在玩JavaScript動態格式,我似乎無法得到這個工作,並想知道如果有人在那裏做了相同的。JavaScript動態格式化

這是我的功能我已經創建了一個進來的,比如格式化,字符串,數字等的一組數傳:

function Formatter(formatters) { 
      this.format = function(value, type) { 
       switch(type) { 
        case "string": 
         return value => formatters.string 
         break; 
        case "currency": 
         return value => formatters.curency 
         break; 
        case "number": 
         return value => formatters.number 
         break; 
        default: 
         return value; 
         break; 
       } 
      } 
     } 

我發送給它的初始化這個:

formatters: { 
         'string': input => input, 
         'number': input => input.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,'), 
         'currency': input => input.toFixed(3), 
         'url': input => (`<a href="${input.url}">${input.title}</a>`) 
        } 

洙......

var formatter = new Formatter({ 
          'string': input => input, 
          'number': input => input.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,'), 
          'currency': input => input.toFixed(3), 
          'url': input => (`<a href="${input.url}">${input.title}</a>`) 
         }); 

// This should display "test" as the format is just itself. 
formatter.format("test", "string); 

這實際顯示爲value => formatters.string

有沒有什麼方法可以實現我在這裏要做的事情?

+0

有沒有'formatters.value' – dandavis

+0

帶我了一下,但我明白了! – jhpratt

回答

1

好吧,基本上你正在做的是返回箭頭函數本身,而不是被調用的值。你想要做的是請致電formatters.string與一個參數value

function Formatter(formatters) { 
    this.format = function(value, type) { 
     switch(type) { 
      case "string": 
       return formatters.string(value); 
       break; 
      case "currency": 
       return formatters.curency(value); 
       break; 
      case "number": 
       return formatters.number(value); 
       break; 
      default: 
       return value; 
       break; 
     } 
    }; 
} 

var formatter = new Formatter({ 
          'string': input => input, 
          'number': input => input.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,'), 
          'currency': input => input.toFixed(3), 
          'url': input => ('<a href="${input.url}">${input.title}</a>') 
         }); 

// This should display "test" as the format is just itself. 
formatter.format("test", "string"); 
+0

請注意,JavaScript(ES6)具有原生類,您可能希望查看這些原生類。 – jhpratt

+1

謝謝你在這裏的時間,我知道這是一個困難的問題,並且耗費時間來弄清楚。非常感謝! –

2

@jhpratt分是什麼錯誤。

我只是想建議你不應該使用類。決不。

該解決方案的代碼噪聲要少得多。可讀,可維護

const formatters = { 
 
    'string': input => input, 
 
    'number': input => input.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,'), 
 
    'currency': input => input.toFixed(3), 
 
    'url': input => (`<a href="${input.url}">${input.title}</a>`) 
 
} 
 

 
const format = (type, value) => formatters[type](value) 
 

 
const formatted = format('string', 'hello') 
 

 
console.log(formatted)

UPDATE

使用咖喱通過格式化以及

const formatters = { 
 
    'string': input => input, 
 
    'number': input => input.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,'), 
 
    'currency': input => input.toFixed(3), 
 
    'url': input => (`<a href="${input.url}">${input.title}</a>`) 
 
} 
 

 
const format = formatters => type => value => formatters[type](value) 
 

 
// You can use it in one call 
 
format(formatters)('string')('hello') 
 

 
// Create a function with predefined formatters 
 
const myFormatter = format(formatters) 
 
myFormatter('string')('hello') 
 

 
// Create a function with predefined formatters and for a specific type 
 
const urlFormatter = format(formatters)('url') 
 
urlFormatter('https://www.google.com')

+0

是的,但是如果你想要不同的格式化選項(如兩個'formatters')呢?那麼你會多次用'format'和'formatters'來污染命名空間。使用一個類只使用一個名字,而不是兩個。 – jhpratt

+0

使用類時,您必須以另一種方式實例化另一個類,從而給出另一個名稱。所以一個而不是兩個交換的可讀性,可維護性和可重用性值得我。或者您可以傳遞格式化函數以及使用咖喱例如函數參數。 – cstuncsik

+1

這真是太棒了,我在這裏選擇一個答案時很勉強,因爲@ jhpratt最初引導了這個問題,並且這個問題在這個問題上得到了擴展。我會對此讚不絕口,因爲它很棒,但必須接受其他答案,因爲需要花費很多時間來弄清楚。我對你們倆都很感激。 –