簡體   English   中英

將聲明的變量分配給數組javascript中的字符串

[英]Assigning a declared variable to a string in array javascript

假設我有以下全局變量:

var name, car;

然后,我聲明一些值:

const languageStrings = {
    WELCOME_MESSAGE: 'Welcome #name, you have a #car',
    NAME_USER: "#name",
    CAR_USER: '#car'
};

然后,我需要將其分配給一個函數。 例如:

if (firstTime){
    welcomeMsg = WELCOME_MESSAGE;
}

現在,我有兩個問題:

1)我如何在字符串中插入變量,以便在調用值對時動態更新它?

2)如何使用JSON進行相同操作?

您將必須創建一個返回變量值的函數。

在您的情況下:

welcomeMessage = function(){
   return WELCOME_MESSAGE
}

並且您可以通過以下方式引用變量:

welcomeMessage()

因此,您將要分配一個變量作為一個函數,該函數返回另一個變量的當前值。 您可以通過將變量作為函數來獲取值。

關於如何在字符串中插入變量的問題的答案是:

WELCOME_MESSAGE: 'Welcome ' + name + ', you have a ' + car,

或在定義之前:

function mesg(name, car){
    return "Welcome" + name + ", you have a " + car;
}
mesg(bob, BMW);

在這種情況下,名稱和汽車是在后面定義的。

當某些變量更改時,您不能具有JSON結構或字符串“自動”更新。 但是,還有其他方法可以進行這種模板化。 您可以在需要時創建一個函數來創建歡迎消息:

function getWelcomeMessage(name, car) {
  return "Welcome "+name+", you have a "+car;
}

然后,您將執行諸如welcomeMsg = getWelcomeMessage("Joe", "Camry");

如果您不想為每個模板編寫函數(即,如果有很多模板),則可以使用String.replace如下所示:

function applyTemplate(template, params) {
  return template.replace(/#(\w+)/g, (m, name) => params[name]);
}

用法示例:

 function applyTemplate(template, params) { return template.replace(/#(\\w+)/g, (m, name) => params[name]); } const WELCOME_TEMPLATE = "Welcome #name, you have a #car"; var name = "Joe"; var car = "Camry"; var welcomeMessage = applyTemplate(WELCOME_TEMPLATE, {name, car}); console.log(welcomeMessage); 

JavaScript中的字符串是原始類型,它按值傳遞。 因此,一旦為變量分配了字符串,它就永遠不會改變,除非您為它明確分配了另一個值(或對象引用)。

但是,您可以詢問對象類型的幫助 ,它可以使你的數據反應性 (或動態,如果你喜歡這個詞)在一定條件下更新。

var languageStrings = {
  WELCOME_MESSAGE: '',
  NAME_USER: '',
  CAR_USER: ''
}

Object.defineProperty(languageStrings, 'name', {
  get: function (name) {
    return this.NAME_USER
  },
  set: function (name) {
    this.NAME_USER = name
    this.WELCOME_MESSAGE = `Welcome ${this.name}, you have a ${this.car}.`
  }
})

Object.defineProperty(languageStrings, 'car', {
  get: function (car) {
    return this.CAR_USER
  },
  set: function (car) {
    this.CAR_USER = car
    this.WELCOME_MESSAGE = `Welcome ${this.name}, you have a ${this.car}.`
  }
})

現在,每當更改languageStrings.namelanguageStrings.car ,您想要的所有三個字符串將自動采用您剛剛設置的新值:

languageStrings.name = 'Leo'
languageStrings.car = 'BMW'

for (let key in languageStrings) {
  console.log(`${key}: ${languageStrings[key]}`)
}
// WELCOME_MESSAGE: Welcome Leo, you have a BMW.
// NAME_USER: Leo
// CAR_USER: BMW

您不必一直手動調用applyTemplate ,就像@qxz的答案一樣(不過,我並不是說他錯了)。

另外,請注意,甚至namecar都不是枚舉值-不能通過for infor ofObject.keys訪問它們! 太好了,您的實現細節被隱藏了,不會給使用您代碼的其他開發人員帶來任何煩惱或困惑。

實際上,這種反應模型在當今的MV *前端框架中已得到廣泛使用,例如Vue

關於你的第二個問題,我並沒有坦白地說。 只是JSON.parse那都是普通的JavaScript,不是嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM