Javascript 修改数组$的元素(此)

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

我使用的是第三方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)
对象执行此操作,或者该方法不起作用,因为它仅在
的范围内。每个
循环都不会传递回
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。。。等

我有n
Jmol.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]。替换
,因为
这个
将引用子数组“”(或者,如果它是字符串:
这个。替换
)。但后者是行不通的