jQuery - 使用“for-each”循环更改循环外的变量

Posted

技术标签:

【中文标题】jQuery - 使用“for-each”循环更改循环外的变量【英文标题】:jQuery - Use a "for-each" loop to change variables outside of loop 【发布时间】: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,可以以完全不同的方式解决(我仍然不明白你想要实现什么)。 你可以用十五个。 如果你有多个变量代表相似的数据,你可能应该使用一个数组而不是一堆变量。这将使您的循环版本也能正常工作。 【参考方案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。

以上是关于jQuery - 使用“for-each”循环更改循环外的变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 for-each 循环打印 ArrayList

2优先使用for-each循环

从字节码看Java中for-each循环(增强for循环)实现原理

For-Each循环Java错误ArrayIndexOutOfBoundsException

For-Each循环

For-Each 循环 Java 错误 ArrayIndexOutOfBoundsException