【问题标题】:Javascript looping through variablesJavascript循环遍历变量
【发布时间】:2019-01-07 00:10:59
【问题描述】:

所以现在这是我当前的代码,我正在尝试找出一种方法来循环遍历我已经声明的变量(假设变量 1-9 已经有值)。我只是想知道这是否可能?

var title;
var brief;
var hover;
var whatTitle;
var whatDesc;
var whyTitle;
var whyDesc;
var funTitle;
var funDesc;
var titles = [];
var briefs = [];
var hovers = [];
var whatTitles = [];
var whatDescs = [];
var whyTitles = [];
var whyDescs = [];
var funTitles = [];
var funDescs = [];

    var obj = {'titles' : title};
    if(localStorage.getItem('titles') != null) {
        var tmp = JSON.parse(localStorage.getItem('titles'));
        for(var i = 0;i<tmp.length;i++) {
            titles.push(tmp[i]);
        }

    }
    titles.push(obj);
    localStorage.setItem("titles", JSON.stringify(titles));

如果我们打印出循环代码,我想要的输出:

var obj = {'titles' : title};
    if(localStorage.getItem('titles') != null) {
        var tmp = JSON.parse(localStorage.getItem('titles'));
        for(var i = 0;i<tmp.length;i++) {
            titles.push(tmp[i]);
        }

    }
    titles.push(obj);
    localStorage.setItem("titles", JSON.stringify(titles));

var obj = {'briefs' : brief};
    if(localStorage.getItem('briefs') != null) {
        var tmp1 = JSON.parse(localStorage.getItem('briefs'));
        for(var i = 0;i<tmp.length;i++) {
            briefs.push(tmp[i]);
        }

    }
    briefs.push(obj);
    localStorage.setItem("briefs", JSON.stringify(briefs));

var obj = {'hovers' : hover};
    if(localStorage.getItem('hovers') != null) {
        var tmp2 = JSON.parse(localStorage.getItem('hovers'));
        for(var i = 0;i<tmp.length;i++) {
            hovers.push(tmp[i]);
        }

    }
    hovers.push(obj);
    localStorage.setItem("hovers", JSON.stringify(hovers));

...etc

【问题讨论】:

  • 为此,您需要使用此变量声明 ObjectArray。然后就可以循环遍历它。不能循环变量,你需要一些数据结构来循环
  • 啊,我明白了,但这意味着在对象/数组中,我必须在我的问题中重新声明第 1-9 行的变量,因此它将是 var data = { 'title' : document .getElementById('element').value 等..} ?

标签: javascript html css loops for-loop


【解决方案1】:

如果代码在浏览器中运行,那么您可以执行以下操作:

for(key in window) { console.log(window[key]) } // print all variables

变量与全局命名空间相关联。也就是说最上面的“this”引用或者window对象。

【讨论】:

  • 这将提供window上的所有键,而不仅仅是他声明的那些!
  • @webNeat 说了什么。你可以这样做,但你真的不应该这样做。
  • 嗯..这只是 javascript 代码的一部分,我在窗口上还有很多其他的东西,所以它可能会起作用,但是@webNeat 说的,它会给我窗口上的所有键.但是还是谢谢你!
【解决方案2】:

您的代码就快到了。如果您查看“所需输出”示例,您会发现“展开循环”的每个元素之间唯一真正不同的是本地存储的关键(“标题”、“简报”、“悬停”) .

考虑到这一点,您可以使用 Object 将键映射到您在顶层拥有的变量。所以这个:

var titles = [];
var briefs = [];
var hovers = [];
var whatTitles = [];
var whatDescs = [];
...

变为(UPDATE:保留初始值设定项):

var key_to_collection = {
  'titles': [title],
  'briefs': [brief],
  'hovers': [hovers],
  'whatTitles': [whatTitles],
  'whatDescs': [whatDescs],
}

然后,循环遍历这个对象的值:

Object.keys(key_to_collection).forEach(function(key) {
  var obj = {};
  collection = key_to_collection[key];
  obj[key] = collection;
  if(localStorage.getItem(key) != null) {
    var tmp = JSON.parse(localStorage.getItem(key));
    for(var i = 0;i<tmp.length;i++) {
      collection.push(tmp[i]);
    }
  }
  collection.push(obj);
  localStorage.setItem(key, JSON.stringify(collection));
});

【讨论】:

  • 但是声明的变量中有值呢?我的问题中的变量 1-9^
  • 您是否尝试使用这些值预先设置集合?如果是这样,您可以使用titles: [ title ],而不是使用titles: []。您的示例有点模糊,因为标题为空
  • @Marie 的值我的意思是我的问题中第 1-9 行的变量,它们的值已经取自我的 HTML 代码,例如。 var title = document.getElementById('elementID').value;
  • 值只是一个字符串吗?你解析它吗?只要你不介意它先来,你仍然可以做同样的事情。如果你想要它最后你可以使用shift而不是push
  • @Marie 是的,它只是一个字符串,我想我还没有解析它
【解决方案3】:

例如,如果您的变量名称是title,那么您可以使用window['title'] 访问它。这意味着如果你定义一个全局变量名数组:

const varNames = ['title', 'brief', 'hover', ...]

然后你可以像下面这样循环

for(const name of varNames) {
  const value = window[name]
  // do whatever you want using the variable name and value 
}

我希望这能解决你的问题:)

【讨论】:

  • 啊,好吧,我会试试你的解决方案。谢谢!
  • 我试用的时候说const是保留字,不能这样用
猜你喜欢
  • 2018-05-26
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多