我正在使用第三方javascript库,需要将嵌套数组传递给函数。我正在多次使用此函数,因此将数组存储在变量中并将其传递给函数。但是,数组的1个元素的字符串的一部分需要是我正在传递的东西的当前id;我有一些看起来有点像的东西:
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)
对象执行此操作,或者这不起作用,因为这只是在.each
循环的范围内,并且不会传递回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,它允许显示分子图形。 jsmol为简单的html元素包含一些便利函数,我正在使用的是Jmol.jmolMenu() - 我实际得到的嵌套数组是
arr = [ ["select model=id; color blue", "colour this model blue"],
["select model=id; color green", "colour this model green"]
]
然后我有 n 分子模型显示在同一个applet
中,jsmol引用为1.1,2.1,3.1,......等
我有 n Jmol.jmolMenu
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"]
]
);
我希望这有点意义,并解释为什么我需要修改数组(之前可能看起来很奇怪!)
答案 0 :(得分:2)
更新
看到你正在处理嵌套数组,我的初步答案还不够,但仍然是一个简单的解决方法:
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数组?为什么不使用普通香草?在这里写的更快,更短,更容易:
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;
});
像以前一样映射,但将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;
});
这就是它的全部内容。
您当前的代码可能会遇到"陷阱" 。正如我在评论中提到的那样,您的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都将被替换。 <{1}}标志使模式不区分大小写。