我有这段代码:
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) 值 (?,?,?,?,?) “
和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
的所有不同项目填充全局数组?
提前致谢。如果您需要任何进一步的信息,请询问!
最佳答案
Javascript always passes by value. However, if you pass an object to a function, the "value" is really a reference to that object, so the function can modify that object's properties but not cause the variable outside the function to point to some other object.
您只看到找到的最后一项的原因是因为您在每次迭代中覆盖 insertQuery2
(这是一个对象)中的第二个索引并将其传递给 push
函数。因此,insertquery2[1]=obj;
每次都会修改该值,并且最后一次修改是在最后一次迭代期间。
无需修改 insertQuery2
,只需创建一个新数组:
var copyInsertQuery2 = [insertQuery2[0], obj];
并将其推送到 batchQueries
。
关于Javascript array.find() 回调将对象覆盖为全局数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39067745/