问题描述
假设我有这个数组。
const arr = [['grass','water'],['fire','ground'],['fairy','mage'],['fighter','fire']];
所以我想要的是将 arr[0] 与 arr[2]、arr[1] 与 arr[3] 连接起来。
这必须通过一些数组方法或循环来完成,因为我不知道我将拥有多少元素。
结果应该是这样的
const arr = [['grass','water','fairy','ground','fighter','fire']];
解决方法
如果你用数组长度的一半修改当前索引,那么你将在结果数组中得到相应的索引。
原始数组中的索引
0 1 2 3 4 5
结果数组中的索引
0 1 2 0 1 2 // After taking modulus with 3 i.e. half of the array length
解决方案
-
如果所需位置为空,我已使用
Nullish coalescing operator
为res
数组分配空数组。 -
然后将所有元素推入这个位置,最后返回结果。
注意:此解决方案仅适用于偶数长度的数组。
const arr = [
["grass","water"],["fire","ground"],["fairy","mage"],["fighter","fire"],["water","ice"],["ground","rock"],];
const result = arr.reduce(
(r,el,i) => (
(r[i % (arr.length / 2)] ??= []),r[i % (arr.length / 2)].push(...el),r
),[]
);
console.log(result);
你可以这样做:
const arr = [['grass','water'],['fire','ground'],['fairy','mage'],['fighter','fire']];
const newArr = [];
for (let i = 0; i < arr.length/2; i++){
newArr.push(arr[i].concat(arr[i + 2]));
}
console.log(newArr);
这里有几个适用于偶数数组的选项。
无突变
-
从数组开始迭代到一半。
-
将当前索引处的项与距数组中间等距的项连接起来:
- 迭代 1:
[0,1,2,3] ^ ^
- 迭代 2:
[0,3] ^ ^
-
将这些添加到一个新数组中。原版及其所有成员均未受影响。
带循环
function* slice(start,end,arr) {
if (start < 0)
start = arr.length + start;
if (end < 0)
end = arr.length + start;
for (let i = start; i < end; i++) {
yield arr[i];
}
}
const arr = [['grass','fire']];
const middle = arr.length / 2;
const result = Array.from(
slice(0,middle,arr),(first,i) => first.concat(arr[middle + i])
);
console.log(result);
使用数组方法
const arr = [['grass','fire']];
const middle = arr.length / 2;
const result = arr
.slice(0,middle)
.map((first,i) => first.concat(arr[middle + i]));
console.log(result);
使用生成器
为了避免来自 .slice()
的中间数组,您可以使用 a generator function 并将其传递给 Array.from()
提供映射函数以生成数组:
const arr = [['grass',i) => first.concat(arr[middle + i]));
console.log(result);
有突变
-
从数组中间开始,然后向后。
-
删除数组中的最后一项。将其成员添加到当前索引处的项目中。
- 迭代 1:
[0,3] ^ ^ remove last: 3 combine with: 1
- 迭代 2:
[0,13,2] ^ ^ remove last: 2 combine with: 0
- 最终结果:
[02,13]
-
这一切都是就地完成的。
arr
及其成员均已修改。
const arr = [['grass','fire']];
const middle = arr.length / 2;
for (let i = middle - 1; i >= 0; i--) {
const first = arr[i];
const second = arr.pop();
first.push(...second);
}
console.log(arr);