Javascript array.find()回调将对象覆盖为全局数组

时间:2016-08-21 18:52:05

标签: javascript arrays find

我有这段代码:

wordObj.baseLang.find(function (item) {
        if (item.hasOwnProperty("Example")) {
            var exTranslation = wordObj.targetLang.filter(function (targetLangItem) {
                if (targetLangItem.id === item.id) return targetLangItem.Example || '';
            });
            var obj=[item.id,wordObj.ID,lid,item.Example,(exTranslation[0] ? exTranslation[0].Example : null)];
            console.log(obj);
            insertquery2[1]=obj;
            batchQueries.push(insertquery2);
        }
    });

其中:wordObj是一个包含字段baseLang的对象,该字段是一个对象数组(此数组中的某些对象具有键Example)。我还有一个全局数组batchQueries,它将保存像我试图在上面的代码块中创建的子数组。数组insertquery2的长度为2:

  • insertquery2[0]有一个字符串,例如:"insert into tablename (col1,col2,col3,col4,col5) values (?,?,?,?,?)"
  • insertquery2[1]将保存查询的实际值(这是上述代码尝试执行的操作)。

我的目标是为同一个表创建插入查询数组。即:

batchQueries = [
     ["insert into tablename (col1,col2,col3,col4,col5) values (?,?,?,?,?)",[val1,val2,val3,val4,val5]],         
     ["insert into tablename (col1,col2,col3,col4,col5) values (?,?,?,?,?)",[val1,val2,val3,val4,val5]],
]

(我仅限于这种阵列结构)。

我的问题是,如果我是console.log obj,我可以为每个项目获取不同的值,同时在insertquery2[1]中添加对象然后将其推送到全局数组将仅显示找到最后一项。

我知道这与推动价值和回调有关,但无论我尝试过什么,我都无法让它发挥作用

如何使用具有属性Example的所有不同项目填充全局数组?

提前谢谢。如果您需要任何进一步的信息,请询问!

1 个答案:

答案 0 :(得分:1)

  

Javascript总是按值传递。但是,如果将对象传递给函数,则“value”实际上是对该对象的引用,因此该函数可以修改该对象的属性,但不会导致函数外部的变量指向其他对象。

您只看到找到的最后一项是因为您在每次迭代中覆盖insertQuery2(这是一个对象)中的第二个索引并将其传递给push函数。因此,insertquery2[1]=obj;每次修改值,并且在最后一次迭代期间修改它的最后一次。

而不是修改insertQuery2,只需创建一个新数组:

var copyInsertQuery2 = [insertQuery2[0], obj];

并将其推送到batchQueries