【问题标题】:Javascript + build a dynamic variable name from a variable name and string [duplicate]Javascript +从变量名和字符串构建动态变量名[重复]
【发布时间】:2019-07-03 05:47:23
【问题描述】:

我不清楚执行以下操作的正确语法。

  • 我试过 eval() 我也试过 [] 和 {[]}..

我从这个开始:

var player1InitStart = 0;
var player2InitStart = 0;
var player3InitStart = 0;
var player4InitStart = 0;

var playerID =  event.target.id; // will return, player1, 2, 3, 4

在这样的检查中使用:

if(eval(playerID + "InitString") == 0){
    //do something, first time starting video
    eval(playerID + "InitString") = 1;
    alert('First Time Playing Video' + eval(playerID + "InitString"));
}

我正在尝试将 playerID 值与字符串一起使用:“InitStart”..

这样我就可以更新上面的目标 xxInitStart 变量了。

如何将 var playerID 与字符串 InitStart 连接起来,以便现在可以针对 playerXInitSTart 变量之一进行更新?

更新:对我有用的答案/解决方案-

  • 不知道为什么要使用 $ 字符? (让我想起了 PHP)
  • 不知道为什么后面的勾号是'' are there either? ''

    var playerID = event.target.getIframe().id; var targetInitID = ${playerID}InitStart;

    //访问(获取或设置) 警报(窗口 [targetInitID]); 窗口[targetInitID] = 1;

【问题讨论】:

  • 不要。使用一个对象(或数组)而不是 4 个单独的变量
  • 你能把它放到一些上下文中吗?我究竟会在数组中放入什么?我仍然需要获取返回的值/变量(playerID,它将是 player1、player2、player 3 或 player4).. 并附加 InitStart 字符串/扩展以定位变量.. 我看不到数组如何在这里发挥作用?或帮助?

标签: javascript string variables concatenation


【解决方案1】:

我们在这里构建字符串和地址 window[yourvar] 来增加,这对你有用吗

var player1InitStart = 0;
var player2InitStart = 0;
var player3InitStart = 0;
var player4InitStart = 0;

//var playerID =  event.target.id; // will return, player1, 2, 3, 4

document.querySelectorAll('div').forEach(div => {
  div.addEventListener('click', clickEvent);
});

function clickEvent(event) {
  let playerID = `${event.target.id}InitStart`;
  window[playerID] += 1;
  logVars();
}

function logVars() {
  console.log(player1InitStart);
  console.log(player2InitStart);
  console.log(player3InitStart);
  console.log(player4InitStart);
}
<div id="player1">1</div>
<div id="player2">2</div>
<div id="player3">3</div>
<div id="player4">4</div>

下面是一个遵循某些性能建议的解决方案:

var players = {
  player1InitStart: 0,
  player2InitStart: 0,
  player3InitStart: 0,
  player4InitStart: 0
};

document.querySelectorAll('div').forEach(div => {
  div.addEventListener('click', clickEvent);
});

function clickEvent(event) {
  let playerID = `${event.target.id}InitStart`;
  players[playerID] += 1;
  logVars();
}

function logVars() {
  for(let k in players) {
    console.log(players[k]);
  }
}
<div id="player1">1</div>
<div id="player2">2</div>
<div id="player3">3</div>
<div id="player4">4</div>

【讨论】:

  • 虽然这应该可行,但有时我们不需要回答直接问题,而是引导 OP 采用更好的方法。这是其中之一。
  • “window”为什么以及从哪里来?上面代码中的“让”在哪里做?
  • @whispers:如果这个javascript在浏览器中运行,浏览器会暴露全局变量window
  • per @SergioTulentsev 我同意第二种解决方案,使用对象更好。更好的是玩家对象数组。
  • 我只是想设置/更新一个变量以显示它已经播放过一次。为什么连接两条数据的行上有反引号?我认为没有理由将这些变量放入数组中。永远不会有任何循环来更新它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2021-08-26
  • 2013-02-12
相关资源
最近更新 更多