Javascript 修改数组$的元素(此)
我使用的是第三方javascript库,它需要将嵌套数组传递给函数。我多次使用这个函数,因此将数组存储在变量中并将其传递给函数。但是,数组中1个元素的字符串的一部分必须是我传递的对象的当前id;我有一个可以工作的东西,看起来有点像:Javascript 修改数组$的元素(此),javascript,jquery,Javascript,Jquery,我使用的是第三方javascript库,它需要将嵌套数组传递给函数。我多次使用这个函数,因此将数组存储在变量中并将其传递给函数。但是,数组中1个元素的字符串的一部分必须是我传递的对象的当前id;我有一个可以工作的东西,看起来有点像: myArray = [["foo bar id","some data"],["foo2 bar2 id","some other data"]] func1(($m1 = myArray.slice(0), $.each($m1, functio
myArray = [["foo bar id","some data"],["foo2 bar2 id","some other data"]]
func1(($m1 = myArray.slice(0),
$.each($m1, function(i){
$m1[0] = myArray[i][0].replace("id","1");
})))
是否确实需要制作阵列的副本;是否有一种方法可以通过$(this)
对象执行此操作,或者该方法不起作用,因为它仅在的范围内。每个循环都不会传递回func1
更新
下面的原始答案似乎不起作用-我第二次引用时数组的值是第一次引用时给出的值:
myArray = [["foo bar id","some data"],["foo2 bar2 id","some other data"]]
func1(
myArray = myArray.map(function(value)
{
value[0] = value[0].replace(/\bid\b/gi, '1');
console.log(value[0]); //returns "foo bar 1" as expected
return value;
});
)
func1(
myArray = myArray.map(function(value)
{
value[0] = value[0].replace(/\bid\b/gi, '2');
console.log(value[0]); //This returns "foo bar 1", not "foo bar 2"!
return value;
});
)
更新(完整正确的代码!)
为了将这一切放在上下文中,第三方库是,它允许显示分子图形。jsmol包含一些简单html元素的方便函数,我使用的是-我实际得到的嵌套数组是
arr = [ ["select model=id; color blue", "colour this model blue"],
["select model=id; color green", "colour this model green"]
]
然后我在同一个applet
中显示了n个分子模型,jsmol引用了1.1,2.1,3.1。。。等
我有nJmol.Jmol菜单
s(它只创建html选择列表);第一个更改1.1的颜色,第二个更改2.1的颜色,依此类推-这就是我需要将id的值更改为相关模型的地方,以及为什么替换只能替换当前副本的当前实例-否则它会使其他分子的列表无法工作
在我的第一份菜单中,我实际上需要
Jmol.jmolMenu(jmol,
[
["select model=1.1; color blue", "colour this model blue"],
["select model=1.1; color green", "colour this model green"]
]
);
在我的第二段:
Jmol.jmolMenu(jmol,
[
["select model=2.1; color blue", "colour this model blue"],
["select model=2.1; color green", "colour this model green"]
]
);
我希望这有点道理,并解释了为什么我需要修改数组(这在以前可能看起来很奇怪!)更新:
鉴于您正在处理一个嵌套数组,我最初的回答还不够充分,但仍然很容易解决:
var myArray = ["foo bar id","my first array"];
myArray = myArray.map(function(value)
{
return value.replace('id','1');//replaces only the first occurrence of "id", thouh
});
为什么要使用jQuery修改标准JS数组?为什么不使用普通的vanillaJS?在这里写起来更快、更短、更容易:
var myArray = [["foo bar id","some data"],["foo2 bar2 id","some other data"]];
myArray = myArray.map(function(value)
{
value[0] = value[0].replace(/\bid\b/gi, '1');
return value;
});
只需像前面一样映射,但将值
参数视为它所在的数组。如果需要每个子数组的键,例如访问另一个数组中的相应id:
var ids = ['1', '2'];
myArray = myArray.map(function(value, idx)//second argument is the key
{
value[0] = value[0].replace(/\bid\b/gi, ids[idx]);
return value;
});
就这些
您可能会在使用当前代码时遇到“gotcha”。正如我在评论中提到的,您的replace
调用将只替换字符串中第一个出现的“id”,而不是全部。它还将替换“id”,即使它是单词的一部分,并且替换调用区分大小写:
'ID placid id'.replace('id', '1');//ID plac1 id
这些问题可以通过使用正则表达式来解决:
'ID placid id'.replace(/\bid\b/gi, '1');//1 placid 1
模式中的\b
表示单词边界。g
标志使模式成为全局模式,所有出现的id都将被替换。i
标志使模式不区分大小写。Hmm,我想我没有意识到我可以!它比我暗示的要复杂一点——它实际上是一个嵌套数组,这就是为什么我有一个$;很抱歉,这不清楚。我编辑了这个问题,以反映我有一个嵌套数组。我想我下一个明显的问题是,通过嵌套元素的循环应该在函数中还是在函数外?还是它真的不重要?@ChrisW:更新了我的答案,还添加了一些其他信息。注意,我将.replace('id','1')
替换为replace(/\bid\b/gi,ids[idx])
。我的回答解释了这一切about@ChrisW:不,$(this)
不起作用,因为回调传递给了$。每个都是在它所迭代的元素的上下文中执行的(myArray[0]。apply(callback)
),这意味着$(this)
与写入$(['foobar id','other value'))
,这毫无意义。如果上下文是一个字符串,那么$('foobar')
将被解释为一个DOM选择器,这就没有什么意义了。您可以在$中执行的操作。每个都是:这个[0]。替换,因为这个将引用子数组“”(或者,如果它是字符串:这个。替换)。但后者是行不通的