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
创建了一个临时对象,因此当您更改内部值时,实际变量first
和second
不会改变,而是该对象内部的值是变化。
所以你必须先把它存储为一个变量,然后是console.log
variable[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”循环更改循环外的变量的主要内容,如果未能解决你的问题,请参考以下文章
从字节码看Java中for-each循环(增强for循环)实现原理