【问题标题】:jQuery - Use a "for-each" loop to change variables outside of loopjQuery - 使用“for-each”循环更改循环外的变量
【发布时间】:2019-05-04 00:50:27
【问题描述】:

我有两个变量说:

var first = "first";
var second = "second";

我想使用 $.each 循环进行更改:

$.each({first, second}, function(index, value) {
    value = "changed";  // ASSUME CREATES A NEW VARIABLE?
});

console.log(first);   // DOES NOT CHANGE
console.log(second);  // DOES NOT CHANGE

这可能吗?到目前为止,我的尝试似乎没有产生预期的结果。每个变量都应更改为“已更改”。

编辑:目标是遍历“var first”和“var second”并将它们的值更改为“changed”以避免:

var first = "first";
var second = "second";

first = "changed";
second = "changed";

没有循环的实际使用场景会导致我想避免多行 first = "changed"second = "changed" 代码行。

编辑 #2:这是一个实际的 sn-p 代码。

var favorite_array = [
    "https://api.themoviedb.org/3/account/{account_id}/favorite/movies?api_key=",
    "https://api.themoviedb.org/3/account/{account_id}/favorite/tv?api_key=",
];

var watchlist_array = [
    "https://api.themoviedb.org/3/account/{account_id}/watchlist/movies?api_key=",
    "https://api.themoviedb.org/3/account/{account_id}/watchlist/tv?api_key=",
];

var fquery = (type == "tv") ? favorite_array[1] : favorite_array[0];
var wquery = (type == "tv") ? watchlist_array[1] : watchlist_array[0];


$.each(["fquery", "wquery"], function(index, query) {
    window[query] = window[query].replace("{account_id}", getCookie("account_id"));
    window[query] += api_key + language + "&session_id=";
});

我会提前道歉,JavaScript 不是我的问题。

【问题讨论】:

  • 为什么要这样做?请给我们更多的背景信息,也许有更好的方法来做你想做的事。
  • @ibrahimmahrir 在我的使用场景中,我正在创建一个函数,该函数将具有多个 JSON 查询,在执行查询之前需要构建请求(url)。有两个查询需要发生,两个请求(url)都需要构建。因此,我没有尝试使用 jQuery $.each 在循环中执行此操作,而不是使用替换或 += 语句链。这个问题相当笼统,因为其他人也想做类似的事情。
  • 就目前而言,您不能这样做,因为作为原始值的字符串被复制而不是作为引用传递。唯一的方法是将它们组合成一个对象。顺便说一句,这仍然是一个XY problem,可以以完全不同的方式解决(我仍然不明白你想要实现什么)。
  • 你可以用十五个。
  • 如果你有多个变量代表相似的数据,你可能应该使用一个数组而不是一堆变量。这将使您的循环版本也能正常工作。

标签: javascript jquery arrays foreach var


【解决方案1】:

在您的代码中,您使用{first, second} 创建了一个临时对象,因此当您更改内部值时,实际变量firstsecond 不会改变,而是该对象内部的值是变化。

所以你必须先把它存储为一个变量,然后是console.logvariable[index]

但这在这里不能正常工作,因为该变量不是数组。 $.each() 适用于数组。

所以你必须把它变成一个数组。

【讨论】:

    【解决方案2】:

    真的不明白你为什么要这样做。

    但是,这可能有助于您尝试做的事情:

    var first = "first";
    var second = "second";
    $.each(["first", "second"], function(index, value) {
      window[value] = "changed";
    });
    console.log(first);
    console.log(second);
    

    我真的建议你改用对象或数组。

    请检查@CodePen: https://codepen.io/animatedcreativity/pen/ebdb516cb0c3e728a054ba45b415c17f/


    更新:

    为了使其更加自动化,我建议您以“my_”开头的所有变量。请检查:

    // Use something more unique than my_
    
    var my_first = "first";
    var my_second = "second";
    
    for (var key in window) if (key.substr(0, 3) == "my_") window[key] = "changed";
    
    console.log(my_first);
    console.log(my_second);
    

    这一行会将所有以“my_”开头的变量设置为“已更改”,无论您有多少变量。

    请查看@CodePen https://codepen.io/animatedcreativity/pen/2de7386d83f27945c82e301982901310


    更新:

    最简单的方法是使用@Paulpro 的建议来使用: first = second = "changed";

    【讨论】:

    • 感谢您的回答,我编辑了问题以反映原因。
    • @artomason:没问题,我的朋友。如果我能提供帮助,请为我的答案投票。
    • 我不是很理解你回答的 window[value] 部分。
    • @artomason:另外,我认为@Paulpro 关于first = second = "changed"; 的想法对你来说会容易得多。
    • @artomason:在您的编辑#2 中,您正在执行window[query].replace,请注意window[query] 在这种情况下将为空/未定义,因为它位于函数内部而不是根多变的。所以,请改用 query.replace。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2020-04-05
    相关资源
    最近更新 更多