在JavaScript中在特定索引处插入两个连续元素到数组中

3

我有两个这样的数组:

var firstArray = ['one','two','three','four','five','six','seven'];
var secondArray =['1','2','3','4','5','6','7','8'];

我需要将第二个数组的元素插入到第一个数组中,就像这样:

var combinedArray =['one','two','three','1','2','four','five','six','3','4','seven','5','6','7','8']

我知道我可以在一个元素的特定位置进行切割和插入。然而,我对如何实现这个模式感到困惑。有没有人能帮我解决这个问题?

你如何决定索引? - brk
我需要在第一个数组的每三个元素后插入一个元素。我想通过循环来实现这个目标,但是我无法做到。 - akila arasan
同样的问题。在第一个数组的多少个元素之后,您应该插入第二个数组的元素?还有第二个数组要插入多少个元素,是否总是从第一个数组中选取3个元素然后再选取第二个数组中的2个元素? - Vish
是的,它总是在第一个数组的三个元素之后。但如果第一个数组的长度小于三,则需要将剩余的元素与第一个数组一起追加到第二个数组中。 - akila arasan
1
你的示例输出中有两个 six - Christopher Moore
4个回答

1
你可以使用一个模式来分块,并对所需长度进行切片以创建新数组。

var firstArray = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'],
    secondArray = ['1', '2', '3', '4', '5', '6', '7', '8'],
    data = [firstArray, secondArray],
    pattern = [3, 2],
    result = [],
    i = 0,
    l = data.reduce(function (r, a) { return Math.max(r, a.length); }, 0);

while (i < l) {
    pattern.forEach(function (a, j) {
        result = result.concat(data[j].slice(i * a, (i + 1) * a));
    });
    i++;
}

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
你可以创建两个变量ij,将第一个变量增加3,用于切片第一个数组;将第二个变量增加2,用于切片第二个数组。如果i + 3 > a.length,则将b数组的剩余元素连接到结果中。

var a = ['one','two','three','four','five','six','seven'];
var b = ['1','2','3','4','5','6','7','8'];
var r = [], i = 0, j = 0

while(i < a.length) {
  r.push(...a.slice(i, i + 3), ...b.slice(j, i + 3 < a.length ? j + 2 : b.length))
  i += 3, j += 2
}

console.log(r)


0

更细粒度的方法:

var firstArray = ['one','two','three','four','five','six','seven'];
var secondArray =['1','2','3','4','5','6','7','8'];

var combinedArray = flatten(zip(
  toGroupsOf(3, firstArray), 
  toGroupsOf(2, secondArray)
));

console.log(combinedArray);


//a the utilities for that

function isUint(value){
  return value === (value >>> 0)
}

function toGroupsOf(length, arrayOrString){
  if( !isUint(length) || !length  ) 
    throw new Error("invalid length " + JSON.stringify(length));
  
  return Array.from(
    { length: Math.ceil(arrayOrString.length / length) }, 
    (v,i) => arrayOrString.slice(i*length, (i+1)*length)
  );
}

function zip(...arraysOrStrings){
  var numColumns = arraysOrStrings.length,
      lengths = arraysOrStrings.map(item => (item && +item.length) || 0),
      x=0, y=0;
  return Array.from(
    { length: lengths.reduce((a,b)=>a+b, 0) },
    function(v,i){
      for(var safety = numColumns+1; safety--;){
        if(y < lengths[x])
          return arrays[x++][y];
        else if(++x >= numColumns)
          x=0, ++y;
      }
      throw new Error("something went wrong, this line should have never been reached");
    }
  )
}

function flatten(array){
  return [].concat.apply([], array);
}


0

你实际上可以拼接多个项目:

firstArray.splice(3, 0, "1", "2");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接