Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将元素数组转换为数组的另一个索引_Javascript_Arrays - Fatal编程技术网

Javascript 将元素数组转换为数组的另一个索引

Javascript 将元素数组转换为数组的另一个索引,javascript,arrays,Javascript,Arrays,不确定这是否是重复的,但我在尝试思考在充满元素数组的数组中移动元素的最佳方式时遇到了一些困难 例如: var foo = [ [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4} ], [ {obj: 5}, {obj: 6}, {obj: 7}, {obj: 8} ], [ {obj: 9}, {obj: 10}, {obj: 11}, {obj: 12} ] ]; 如果我移除给定arrayIndex的一个元素,它将移除该元素,然后将所有

不确定这是否是重复的,但我在尝试思考在充满元素数组的数组中移动元素的最佳方式时遇到了一些困难

例如:

var foo = [
    [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4} ],
    [ {obj: 5}, {obj: 6}, {obj: 7}, {obj: 8} ], 
    [ {obj: 9}, {obj: 10}, {obj: 11}, {obj: 12} ]
];
如果我移除给定arrayIndex的一个元素,它将移除该元素,然后将所有正在进行的元素向下移动到适当的数组中。例如,如果我删除obj 3,结果将是:

var arrayIndex = 0;
var objIndex = 2;

var bar = foo[arrayIndex].splice(objIndex, 1);
结果:

bar = [
    [ {obj: 1}, {obj: 2}, {obj: 4}, {obj: 5} ],
    [ {obj: 6}, {obj: 7}, {obj: 8}, {obj: 9} ], 
    [ {obj: 10}, {obj: 11}, {obj: 12} ]
];
bar = [
    [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4} ],
    [ {obj: 5}, {obj: 6}, {obj: 7}, {obj: 9} ], 
    [ {obj: 10}, {obj: 11}, {obj: 12} ]
];
另一个示例如图所示,移除obj 8:

var arrayIndex = 1;
var objIndex = 3;

var bar = foo[arrayIndex].splice(objIndex, 1);
结果:

bar = [
    [ {obj: 1}, {obj: 2}, {obj: 4}, {obj: 5} ],
    [ {obj: 6}, {obj: 7}, {obj: 8}, {obj: 9} ], 
    [ {obj: 10}, {obj: 11}, {obj: 12} ]
];
bar = [
    [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4} ],
    [ {obj: 5}, {obj: 6}, {obj: 7}, {obj: 9} ], 
    [ {obj: 10}, {obj: 11}, {obj: 12} ]
];
我的问题是将所有正在进行的元素转移到正确的数组位置。此外,我希望删除空数组。在那里,foo的长度会减少。foo也会发生变异

这是我的想法:


任何帮助都将不胜感激。

一种简单的方法是将您的物品存储在一维数组中,而不是二维数组中。然后操纵索引

var foo = [ {obj: 1}, {obj: 2}, {obj: 3}, {obj: 4},
    {obj: 5}, {obj: 6}, {obj: 7}, {obj: 8},
    {obj: 9}, {obj: 10}, {obj: 11}, {obj: 12} ];

function remove(arrayIndex, objIndex) {
    var realIndex = arrayIndex * 4 + objIndex;
    foo.splice(realIndex, 1);
}
否则,您必须在每次拼接后重新排列项目

function remove(arrayIndex, objIndex) {
    foo[arrayIndex].splice(objIndex, 1);

    for (var i = arrayIndex + 1; i < foo.length; i++) {
        var obj = foo[i].shift();
        foo[i - 1].push(obj);
    }

    if (foo[foo.length - 1].length <= 0) {
        foo.pop();
    }
}
函数删除(arrayIndex,objIndex){
foo[arrayIndex].拼接(objIndex,1);
对于(变量i=arrayIndex+1;i如果(foo[foo.length-1].length您可以使用一个函数将数组临时展平到一维(记录子数组的原始大小),然后在此基础上应用标准的
拼接
,最后根据记录的大小信息重建二维数组

这样做的好处是,您可以使用的所有功能一次删除多个元素和/或在同一操作中插入其他元素

因此,给定的索引必须是索引,就像输入数组是一维的一样:

函数拼接2d(a,start,deleteCount/*,item1,item2,…*/){
var flat=[],sizes=[];
//制作平面阵列,记录子阵列大小
while(a.长度){
大小。推送(a[0]。长度);
flat=flat.concat(a.shift());
};
//将原始接头应用于平面阵列
[].splice.apply(平面,[].slice.call(参数,1));
//根据尺寸重新重建二维阵列
while(尺寸、长度){
a、 推动(扁平拼接(0,尺寸.shift());
}
返回a;
}
//样本数据
变量foo=
[[{obj:1},{obj:2},{obj:3},{obj:4}],
[{obj:5}、{obj:6}、{obj:7}、{obj:8}],
[{obj:9},{obj:10},{obj:11},{obj:12}]
//变异
拼接2d(foo,2,1);
//输出结果

console.log(foo);
我想
Array.prototype.reduce()
非常适合这项工作。你可以像

var foo=[{obj:1},{obj:2},{obj:3},{obj:4}],
[{obj:5}、{obj:6}、{obj:7}、{obj:8}],
[{obj:9},{obj:10},{obj:11},{obj:12}]
],
removeAndShift=(a,ai,oi)=>ai==a.length-1?a[ai]。拼接(oi,1)
:a.reduce((p,c,i,a)=>{if(i==ai+1){
p、 拼接(oi,1);
p、 推(c.shift());
}
i>ai+1和p.push(c.shift());
返回c;
});
移除和移位(foo,1,3);

console.log(foo);
如果你从数组中删除一个元素,它会自动移动,唯一不会发生的时间就是你实际使用delete时。delete会留下一个空格,这样数组的长度就不会减少。如果你使用的是splice,这应该不是个问题。我注意到你想将元素移动到其他数组中,我会尝试重新分析呃,这一部分。请展示您到目前为止所做的尝试。您也没有描述空数组会发生什么。当然,我会通过plunkr发布我尝试的一个。对于空数组,它不会执行任何删除和移位操作,因为元素索引不在那里。我想在按下和移位之前,您需要检查
c.length
,或者您可以n最后将
null
推到数组上。当然,除非OP想要这样做:问题还没有完全确定。我不会说
reduce
是理想的:你使用它纯粹是为了副作用,返回值没有多大意义。@FizzyTea同意
c.length
这可能是一个问题,因为reducee、 。我必须说,如果有两个相邻的项目以前一个和当前的方式一起移动,那么这种情况非常理想,我正在利用这种reduce的能力。(
p.push(c.shift());
)我可以修改代码,使其返回的值与OP想要的值完全相同,但这样会更加神秘。我想这很酷。