Javascript push或concrat数组的未定义变量

Javascript push或concrat数组的未定义变量,javascript,arrays,Javascript,Arrays,无法弄清楚如何使用N个协议的循环函数(与序列1的形式相同)将协议的所有变量放入新数组中。问题是,在所有情况下,我都会遇到不同的失败(请参阅代码中的取消注释输出),在循环后查看console.log之后,“动态”数组的所有输入都消失了。作为一个初学者,这是令人沮丧的。thx求救 设NR_i=0; 设NR_i_end=7; 让协议=新数组(); 让PROTOCOL_HTML=new Array(); 让协议_CSS=新数组(); 让协议_JS=new Array(); 让PROTOCOL

无法弄清楚如何使用N个协议的循环函数(与序列1的形式相同)将协议的所有变量放入新数组中。问题是,在所有情况下,我都会遇到不同的失败(请参阅代码中的取消注释输出),在循环后查看console.log之后,“动态”数组的所有输入都消失了。作为一个初学者,这是令人沮丧的。thx求救

设NR_i=0;
设NR_i_end=7;
让协议=新数组();
让PROTOCOL_HTML=new Array();		
让协议_CSS=新数组();		
让协议_JS=new Array();	
让PROTOCOL_PHP=new Array();		
让PROTOCOL_MySQL=newarray();
让协议_CindyJS=new Array();
让协议_C_Cpp=新数组();	
设allgemein=[];
//--序列1--//
协议=[{name:“HTML”,索引:[].sort()},
{name:“CSS”,索引:[].sort()},
{name:“JS”,索引:[“document”,“getElementById”,“var”,
“消息”、“控制台”、“日志”].sort()},
{name:“PHP”,索引:[“echo”].sort()},
{name:“MySQL”,索引:[].sort()},
{name:“CindyJS”,索引:[].sort()},
{name:“Python”,索引:[].sort()},
{name:“C_Cpp”,索引:[].sort()}
];

虽然(NR_i我不能100%确定你在问什么,但这可能会有所帮助

PROTOCOL=[{name:“HTML”,索引:[].sort()},
{name:“CSS”,索引:[].sort()},
{name:“JS”,索引:[“document”,“getElementById”,“var”,
“消息”、“控制台”、“日志”].sort()},
{name:“PHP”,索引:[“echo”].sort()},
{name:“MySQL”,索引:[].sort()},
{name:“CindyJS”,索引:[].sort()},
{name:“Python”,索引:[].sort()},
{name:“C_Cpp”,索引:[].sort()}
];
数组=新数组();
对于(i=0;i};
初始化
nameX_2
时,将其初始化为空数组:

var nameX_2 = [];
我假设您希望它是一个数组,因为您稍后尝试将其推入

但是,稍后,在
if
语句中,您重新分配了
nameX_2
。您将它重新分配给一个包含
'PROTOCOL_JS'
的字符串。这在JavaScript中是有效的,不会引发错误,因为JS是一种动态类型的语言。这意味着JS中的变量可以更改类型,就像这里从
数组
到一个
字符串

然后,当您尝试
.push()
将一个元素放入
nameX_2
时,它会说
nameX_2。push
不是一个函数。这是因为您试图对
字符串
调用
.push()
,而该字符串没有
.push()
方法。您可能想在数组中调用它。同样地,
.concat()
方法存在于
字符串上,但只是将它们端到端地连接在一起

当您使用
(扩展运算符)时,字符串
“PROTOCOL_JS”
将拆分为其组件字符。这是因为在JavaScript中,扩展运算符将对象“扩展”为其组件片段。对于字符串,这将它们拆分为字符。对于数组,它将它们拆分为其元素

您可以通过将赋值(
nameX\u 2='PROTOCOL\u'+PROTOCOL[NR\u i].name;
)替换为
.push()
调用来修复它:

nameX_2.push('PROTOCOL_' + PROTOCOL[NR_i].name);
您还可以将
while
循环替换为
for
循环,该循环在一行中处理迭代器初始化、条件和增量。下面的代码片段应该可以实现您正在尝试的操作,根据
协议
数组的内容分配全局变量。但是,请注意这这是JavaScript中的错误做法,建议您使用对象或映射。

//必须用'var'声明变量才能通过'this[]访问`
//坏习惯,使用对象。
var协议_JS=[];
var协议_PHP=[];
让协议=[{name:“HTML”,索引:[].sort()},
{name:“CSS”,索引:[].sort()},
{name:“JS”,索引:[“document”,“getElementById”,“var”,
“消息”、“控制台”、“日志”].sort()},
{name:“PHP”,索引:[“echo”].sort()},
{name:“MySQL”,索引:[].sort()},
{name:“CindyJS”,索引:[].sort()},
{name:“Python”,索引:[].sort()},
{name:“C_Cpp”,索引:[].sort()}
];
for(设NR_i=0;NR_ilog(“PROTOCOL_PHP”,PROTOCOL_PHP);
我这样做了,让我问一下是否有更好的方法来处理这个问题?我的问题还在于我是否可以将代码变小

let PROTOCOL = new Array();
let PROTOCOL_HTML = new Array();        
let PROTOCOL_CSS = new Array();     
let PROTOCOL_JS = new Array();  
let PROTOCOL_PHP = new Array();     
let PROTOCOL_MySQL = new Array();
let PROTOCOL_CindyJS = new Array();
let PROTOCOL_C_Cpp = new Array();   
let NR_i; 
PROTOCOL = [
  {name:"HTML", index:["div","button"].sort()},
  {name:"CSS", index:["background-color","color","border","padding","text-align",
                            "font-size","transition","text-decoration","display","hover"].sort()},
  {name:"JS", index:["document","getElementById","window","addEventListener","click","mouseover","mouseout","change","function","alert", "innerHTML", "Math","random"].sort()},
  {name:"PHP", index:[].sort()},
  {name:"MySQL", index:[].sort()},
  {name:"CindyJS", index:[].sort()},
  {name:"Python", index:[].sort()},
  {name:"C/C++", index:[].sort()}                   
];
for (NR_i = 0; NR_i < PROTOCOL.length; NR_i++) {
  if (PROTOCOL[NR_i].name == "HTML" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_HTML.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "CSS" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_CSS.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "JS" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_JS.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "PHP" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_PHP.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "MySQL" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_MySQL.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "CindyJS" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_CindyJS.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "Pyhon" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_Pyhon.push(...PROTOCOL[NR_i].index);
  }
  if (PROTOCOL[NR_i].name == "C_Cpp" && PROTOCOL[NR_i].index.length != 0) {
    PROTOCOL_C_Cpp.push(...PROTOCOL[NR_i].index);
  }
}
let协议=新数组();
让PROTOCOL_HTML=new Array();
让协议_CSS=新数组();
让协议_JS=new Array();
让PROTOCOL_PHP=new Array();
让PROTOCOL_MySQL=newarray();
让协议_CindyJS=new Array();
让协议_C_Cpp=新数组();
让我来;
协议=[
{name:“HTML”,索引:[“div”,“button”].sort()},
{名称:“CSS”,索引:[“背景色”、“颜色”、“边框”、“填充”、“文本对齐”,
“字体大小”、“过渡”、“文本装饰”、“显示”、“悬停”].sort()},
{name:“JS”,索引:[“document”,“getElementById”,“window”,“addEventListener”,“click”,“mouseover”,“mouseout”,“change”,“function”,“alert”,“innerHTML”,“Math”,“random”].sort(),
{name:“PHP”,索引:[].sort()},
{name:“MySQL”,索引:[].sort()},
{name:“CindyJS”,索引:[].sort()},
{name:“Python”,索引:[].sort()},
{name:“C/C++”,索引:[].sort()}
];
对于(NR_i=0;NR_i