Javascript |奇数数组行为-解析组合数组与预定义数组

Javascript |奇数数组行为-解析组合数组与预定义数组,javascript,arrays,split,push,Javascript,Arrays,Split,Push,我在数组中遇到一些奇怪的行为。我不明白发生了什么事。如果我创建两个数组 var a = [0,0,1,0]; var b = [0,2, 1,2]; 并将它们结合起来 combineChars(); function combineChars(){ combo.push(a); combo.push(b); } 我最终得到了一个数组 combo = [0,0,1,0,0,2,1,2]; 但是,如果我尝试将阵列拆分为两个单独的阵列,它不会按预期进行拆分 function spli

我在数组中遇到一些奇怪的行为。我不明白发生了什么事。如果我创建两个数组

var a = [0,0,1,0];
var b = [0,2, 1,2];
并将它们结合起来

combineChars();
function combineChars(){
   combo.push(a);
   combo.push(b);
}
我最终得到了一个数组

combo = [0,0,1,0,0,2,1,2];
但是,如果我尝试将阵列拆分为两个单独的阵列,它不会按预期进行拆分

function splitArray(a){
    console.log("splitArray("+a+")"); //splitArray(0,0,1,0,0,2,1,2)
    for (i=0;i<a.length;i++){
        if ((i+2)%2==0) {
            rSplit.push(a[i]);
        } else {
            cSplit.push(a[i]);
        }
    }
    console.log("rSplit = " + rSplit); //rSplit = 0,0,1,0
    console.log("cSplit = " + cSplit); //cSplit = 0,2,1,2
}
小提琴:

正如您从小提琴中看到的,如果我创建数组“co”而不是组合两个数组,它的行为与预期的一样

function splitArray(a){
    console.log("splitArray("+a+")"); //splitArray(0,0,1,0,0,2,1,2)
    for (i=0;i<a.length;i++){
        if ((i+2)%2==0) {
            rSplit.push(a[i]);
        } else {
            cSplit.push(a[i]);
        }
    }
    console.log("rSplit = " + rSplit); //rSplit = 0,0,1,0
    console.log("cSplit = " + cSplit); //cSplit = 0,2,1,2
}

任何帮助都将不胜感激


里奇

给定一个空的
组合
数组,以及你的
a
b
数组

combo.push(a);
combo.push(b);
不会像您所说的那样将
a
b
的元素推送到
combo
,而是推送数组本身,使
combo
成为一个包含两个元素的数组,两个元素都是原始
a
b
数组本身

如果使用而不是,您的
组合
数组将按照您最初的预期构造

function splitArray(a){
    console.log("splitArray("+a+")"); //splitArray(0,0,1,0,0,2,1,2)
    for (i=0;i<a.length;i++){
        if ((i+2)%2==0) {
            rSplit.push(a[i]);
        } else {
            cSplit.push(a[i]);
        }
    }
    console.log("rSplit = " + rSplit); //rSplit = 0,0,1,0
    console.log("cSplit = " + cSplit); //cSplit = 0,2,1,2
}
i、 e.将您的
combineChars
功能更改为以下内容:

function combineChars(){
   combo = combo.concat(a);
   combo = combo.concat(b);
}

请注意,您需要重新分配
combo
,因为
concat
不会改变原始数组,而是返回一个新数组。

首先查看内置的
数组。prototype
方法

var rSplit = [].concat(a).concat(b);
var lSplit = [].concat(b).concat(a);

你是而不是以这8个元素的数组组合结束。您将得到一个由2个元素组成的数组组合,每个元素分别是它们各自的原始4个元素数组。数组可以将其他数组作为元素保存。Push将某些内容添加为元素…它不会将数组连接在一起

您需要使用
.concat
来实际组合两个数组


combo=a.concat(b)

您的第一位代码看起来可疑<代码>变量组合[];组合推(a);组合推送(b)
将生成一个嵌套数组(combo.length将为2,第一个元素是整个数组
a
,第二个元素是整个数组
b
),而不是您声称的平面数组(点击F12,自己检查)。您确定最终得到的是
[0,0,1,0,0,2,1,2]以这种方式组合之后?您应该以包含两个元素的
combo
结束,这两个元素都是数组(a和b)。为什么您希望得到您为
rSplit
cSplit
所述的结果?啊。。。我需要循环浏览a和b的内容,并分别推送它们?使用像concat()这样的方法可以为您完成这一任务,或者只需
combo=a.concat(b)由于concat不修改原始数组。@JimboJonny在本例中是正确的,我只想尽可能地遵循OP的逻辑,以突出区别。(这更接近于“推送”值的一般语义——如果combo不是空的,它也会起作用)