【问题标题】:How to concatenate two arrays trough loop, Javascript?如何通过循环连接两个数组,Javascript?
【发布时间】:2021-07-07 15:46:09
【问题描述】:

假设我有这个数组。

const arr = [['grass', 'water'], ['fire', 'ground'], ['fairy', 'mage'], ['fighter', 'fire']];

所以我想要的是连接 arr[0] 和 arr[2],连接 arr[1] 和 arr[3]。

这必须通过一些数组方法或循环来完成,因为我不知道我将拥有多少元素。

结果应该是这样的

const arr = [['grass', 'water', 'fairy', 'mage'], ['fire', 'ground', 'fighter', 'fire']];

【问题讨论】:

  • 到目前为止,您尝试了哪些方法来自己解决这个问题?
  • 这个例子可能会有所帮助:w3schools.com/jsref/tryit.asp?filename=tryjsref_concat
  • 没有动态的方法来做到这一点,这必须非常统计。除非有某种结构图我们可以闲置。
  • 串联应该发生的模式是什么?你能概括一下吗?
  • @mike2501 如果你有奇数怎么办。像 5 个这样的项目?

标签: javascript arrays loops for-loop foreach


【解决方案1】:

如果你用数组长度的一半修改当前索引,那么你会在结果数组中得到对应的索引。

原始数组中的索引

0 1 2 3 4 5

结果数组中的索引

0 1 2 0 1 2  // After taking modulus with 3 i.e. half of the array length

解决方案

  1. 如果所需位置为空,我已使用 Nullish coalescing operatorres 数组分配空数组。

  2. 然后将所有元素推入这个位置,最后返回结果。

注意:此解决方案仅适用于偶数长度的数组。

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);

【讨论】:

  • 是的,这很有效,看起来不错,但对我来说太复杂了,因为我是初学者,正在开发我的第一个应用程序。
  • @mike2501 没问题,等你觉得舒服的时候再回来看看。
  • 有时我一直在努力寻找??= 的用法,但这似乎是一个很好的用法。解决方案很好 - 我喜欢它。但有点不习惯。让一些人更难弄清楚。为了清楚起见,我会写出全文like this,因为它更难作为表达式来阅读。然后,您可以在答案中单独添加单个表达式主体来炫耀它。不知道如何保持逻辑,但更容易理解。也许是一个条件运算符,但我真的不喜欢那些。所以,很好的解决方案,但有点小众。
【解决方案2】:

你可以这样做:

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);

【讨论】:

  • 我刚刚做了那一秒,在你发布之前,因为我注意到我没有使用 .length 属性,是的,这是真的,非常感谢,它解决了问题!
【解决方案3】:

这里有几个适用于偶数数组的选项。

没有突变

  1. 从头开始迭代到数组的一半。

  2. 将当前索引处的项目与与数组中间距离相等的项目连接:

    • 迭代 1:
    [0, 1, 2, 3]
     ^     ^
    
    • 迭代 2:
    [0, 1, 2, 3]
        ^     ^
    
  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', 'water'], ['fire', 'ground'], ['fairy', 'mage'], ['fighter', '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', 'water'], ['fire', 'ground'], ['fairy', 'mage'], ['fighter', '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', 'water'], ['fire', 'ground'], ['fairy', 'mage'], ['fighter', 'fire']];

const middle =  arr.length / 2;
const result = arr
  .slice(0, middle)
  .map((first, i) => first.concat(arr[middle + i]));

console.log(result);

有突变

  1. 在数组中间之前开始并向后走。

  2. 删除数组中的最后一项。将其成员添加到当前索引处的项目。

    • 迭代 1:
    [0, 1, 2, 3]
        ^     ^
    
    remove last: 3
    combine with: 1
    
    • 迭代 2:
    [0, 13, 2]
     ^      ^
    
    remove last: 2
    combine with: 0
    
    • 最终结果:
    [02, 13]
    
  3. 这一切都在原地完成。 arr 及其成员都被修改了。

const arr = [['grass', 'water'], ['fire', 'ground'], ['fairy', 'mage'], ['fighter', '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);

【讨论】:

  • 请您介意看看我的解决方案一次!我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
相关资源
最近更新 更多