JavaScript 数组无法正确填充

标签 javascript arrays google-chrome-extension contextmenu

我正在制作一个使用上下文菜单作为其主要 UI 的 Google Chrome 扩展程序。每个菜单项都会触发相同的内容脚本,但具有不同的参数。我基本上所做的是以 JSON 对象的形式存储每个项目(及其相应的数据),该对象具有以下形式:

{name, parent_id, rule_number, meta_array[], childCount}

name、child_count 和parent_id 用于在构建上下文菜单时创建层次结构。传递给脚本的数据是rule_number (int) 和meta_array(字符串数组)。所有这些对象都存储在一个名为indexData[]的数组中。

当单击菜单项时,提供的 ID 仅用作“indexData”数组中的索引,以获取正确的数据并将其传递给脚本。

例如:

// Iterates through the objects
for(var j = 0; j < objectsArray.length; j++) {

// Context menu created with unique id
var id = chrome.contextMenus.create({
"title": objectArray[j].name, 
"onclick": injectScript,  
"parentId": objectsArray[j].parent_id });

// Stores the objects at the corresponding index
indexData[id] = objectsArray[j]; }

现在,有一组特别大的数据经常返回。每次我想要将这些元素作为菜单的一部分时,我不会列出它们中的每一个,而是向每个需要这组数据作为其子项的 JSON 对象添加一个 bool 参数。创建菜单时,如果该 bool 值设置为 true,则会调用一个函数。然后,该脚本只是迭代一个单独的对象列表,并使它们成为该父对象的子对象。创建的子对象甚至从父对象继承某些东西。

例如,如果父对象具有类似 ["1", "2", "3", "4"] 的元数组,则其子对象都可能看起来像这样 ["1", "2", custom_children_data [3]、“4”]。

问题是最后一部分不起作用。虽然子项创建得很好并且名称正确,但与它们相关的数据是错误的。它始终是该单独列表中最后一个对象的数据。该函数如下所示:

// Iterate through children list
for(var i = 0; i < separateList.length; i++){ 

// Just copying the passed parent object's data
var parentData = data; 

var id = chrome.contextMenus.create({
"title": separateList[i].name, // Get item [i] of the children list (works fine) 
"onclick": injectScript, 
"parentId": parentId           // Will become a child of parent object
 });


// Trying to change some data, this is where things go wrong.
parentData.meta[2] =  separateList[i].meta; 

// Save in indexData
indexData[id] = parentData; }

在循环的第一次迭代中,parentData.meta[2] 从列表中获取正确的值,此后该值将保存在索引数据中。但在随后的迭代中,indexData 中已经存在的所有值都会被清除并被从列表中读取的最新数据替换。当读取最后一个值时,indexData 中所有新添加的元素都会更改为最后一个值,这解释了我的问题。但它到底为什么要这么做呢?在这种情况下,Java 是否以某种方式通过地址而不是值或其他内容来处理数组?

也许我错过了一些非常明显的东西,但经过多次尝试后我仍然无法让它正常工作。我试图在描述中尽可能具体,但我可能忘记提及一些事情,所以如果您想了解其他信息,请直接询问,我很乐意提供更多详细信息。

谢谢。

最佳答案

问题是 indexData[id] =parentData,您将 indexData[id] 设为对parentData的引用,然后在循环的下一次迭代中修改parentData。

由于父数据不是一个简单的数组(它至少包含一个数组或对象),因此不能简单地使用 slice(0) 进行复制。您必须编写自己的复制函数,或使用具有该函数的库。

关于JavaScript 数组无法正确填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6988490/

相关文章:

python - 对角蛇填充数组

google-chrome - 通过远程调试协议(protocol)将 javascript 代码发送到 chrome 应用程序

html - 如何扩展我的 Chrome 扩展程序的弹出窗口

javascript - 删除字符串中的非 ascii 字符

javascript - Vue.js 处理多次点击事件

arrays - hive explode 导致不均匀的值

java - 分割字符串java返回值

javascript - 如何让用JS输入的数字不溢出容器而是跳到下一行?

javascript - JavaScript 函数中的相邻括号如何工作?这在哪里记录?

javascript - Chrome webRequest 响应正文 (POST) 错误