修改数组的元素$(this)

时间:2014-08-14 11:39:26

标签: javascript jquery

我正在使用第三方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"]
     ]
);

我希望这有点意义,并解释为什么我需要修改数组(之前可能看起来很奇怪!)

1 个答案:

答案 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}}标志使模式不区分大小写。

相关问题