【问题标题】:How to interweave two arrays in JavaScript?如何在 JavaScript 中交织两个数组?
【发布时间】:2018-09-25 05:42:41
【问题描述】:

我对让它运行感到非常困惑,因为嵌套循环对我来说仍然有点有趣。

有以下两个数组:

let a = ['y','y','y'];
let z = ['x','x','x','x','x'];

如何让它打印 a 中的一个值,然后 z 中的两个值 之后以此类推?

'y',
'x',
'x',
'y',
'x',
'x',
'y',
'x',
'x'

如果值是:

let a = ['y','y'];
let z = ['x','x','x','x','x'];

它会打印出来:

'y',
'x',
'x',
'y',
'x',
'x',
'x'

这是我迄今为止尝试过的:

for (let i = 0; i < a.length; i++) {
    console.log(a[i]);
    for (let j = 0; j < z.length; j++) {
      console.log(z[j], z[j+1]);
    // break?
    }
}

【问题讨论】:

  • 您的 z 数组包含 5 个元素,但在您的输出中,每个 y 都有 2 对 x,因此请更正这一点。

标签: javascript loops


【解决方案1】:

我修复了你的循环:

let a = ['y','y','y'];
let z = ['x','x','x','x','x'];
for (let i = 0; i < a.length; i++) {
  console.log(a[i]);
  console.log(z[i*2], z[i*2+1]);
}

【讨论】:

    【解决方案2】:

    `
    let a = ['y','y'];
    let z = ['x','x','x','x','x'];
    let j = 0;
    for (let i = 0; i < a.length; i++) {
      console.log(a[i]);
      for (j; j < z.length; j++) {
        console.log(z[j], z[j+1]);
        if(j % 2 == 1){
           break;
        }
      }
    }`

    试试这个。

    【讨论】:

      【解决方案3】:

      您可以选择使用do/while 循环。使用shift() 删除数组的第一项

      let a = ['y1', 'y2', 'y3'];
      let z = ['x1', 'x2', 'x3', 'x4', 'x5', 'x6'];
      
      //Copy the array a and z
      let aTemp = [...a]; 
      let zTemp = [...z];
      
      do {
        if (aTemp.length) console.log(aTemp.shift());
        if (zTemp.length) console.log(zTemp.shift());
        if (zTemp.length) console.log(zTemp.shift());
      } while (aTemp.length || zTemp.length); //Loop while both the temp variables have elements

      【讨论】:

        【解决方案4】:
          let aIndex = 0, zIndex = 0;
        
         while(aIndex < a.length || zIndex < z.length) {
            console.log(
              a[aIndex++],
              z[zIndex++],
              z[zIndex++]
           );
         }
        

        【讨论】:

          【解决方案5】:

          这是一种非破坏性的方法

          var pointer = 0;
          
              for (let i = 0; i < a.length; i++) {
                var count = 0;
                console.log(a[i]);
                for (let j = pointer; j < z.length; j++) {    
                  console.log(z[j]);
                  count++;
          
                  if(count == 2){
                      count = 0;
                      if(i == a.length-1) { continue; }else { pointer = j+1; break; }
                  }
          
                }
              }
          

          【讨论】:

            【解决方案6】:
            let c = j = 0;
            z.map(function(item){
              if(c === 0 && a[j]){ console.log(a[j++]); }
              console.log(item);
              c = c > 0 ? 0 : c + 1;
            });
            

            【讨论】:

              【解决方案7】:

              请看下面的代码。我将您预期的输出结果推送到一个数组中。

                  let a = ['y','y'];
                  let z = ['x', 'x', 'x', 'x', 'x'];
                  let arr = [];
                  for (let i = 0; i < a.length; i++) {
                      var count = 0
                    arr.push(a[i]);
                    for (let j = i * 2; j < z.length; j++) {
                      arr.push(z[j]);
                      count++
                      if (count > 1) {
                          if (z[j+1] !== undefined && a[i+1] === undefined) {
                          for (let k = j+1; k < z.length; k++) {
                            arr.push(z[k])
                          }
                        }
                      break;
                      }
                    }
                  }
              console.log(arr);
              // ["y", "x", "x", "y", "x", "x", "x"]
              

              【讨论】:

                【解决方案8】:

                您根本不需要嵌套循环。这可以通过一个带有两个计数器的循环来完成。

                let a = ['y','y','y'];
                let z = ['x','x','x','x','x'];
                let result = [];
                
                for(let i = 0, j = 0; i < a.length, j < z.length; i++, j+=2) {
                	result.push(a[i], z[j], z[j+1]);
                }
                
                result = result.filter(item => item !== undefined);
                
                console.log(result);

                以下是将相同的代码压缩为单行内核:

                let a = ['y','y','y'];
                let z = ['x','x','x','x','x'];
                let result = [];
                
                for(let i = 0, j = 0; i < a.length, j < z.length; i++, j+=2) {
                	result.push.apply(result, [a[i], z[j], z[j+1]].filter(m => m !== undefined));
                }
                
                console.log(result);

                【讨论】:

                  【解决方案9】:

                  您可以取长度并计算数组的间隔/部分长度,用于拼接并推送到结果集。

                  function getX(a, b) {
                      var iA = Math.ceil(a.length / b.length),
                          iB = Math.ceil(b.length / a.length),
                          pA = 0,
                          pB = 0,
                          result = [];
                  
                      while (pA < a.length || pB < b.length) {
                          result.push(
                              ...a.slice(pA, pA += iA),
                              ...b.slice(pB, pB += iB)
                          );
                      }
                      return result;
                  }
                  
                  console.log(getX(['y','y','y'], ['x','x','x','x','x']).join(' '));
                  console.log(getX(['y','y'], ['x','x','x','x','x']).join(' '));

                  【讨论】:

                    【解决方案10】:

                    这是一个使用Array.prototype.reduce()destructuring assignment 的示例:

                    let a = ["y", "y", "y"];
                    let z = ["x", "x", "x", "x", "x"];
                    
                    let y = a.reduce((acc, current, index) => {
                      return [...acc, current, ...z.splice(0, a[index + 1] ? 2 : z.length)];
                    }, []);
                    
                    console.log(y);
                    console.log(z);

                    在每个 a 数组元素上,您获取先前累积的数组(最初为 []),添加 current 元素和来自 z 的两个元素,如果 a 有下一个元素或其余的 z 元素,如果currenta 的最后一个元素。 不幸的是,这会在过程中从z 中删除元素,因此您可能希望在运行它之前复制它,即您可以将reduce 包装在一个函数中并传递z 的副本:

                    let a = ["y", "y", "y"];
                    let z = ["a", "b", "c", "d", "e", "f", "g"];
                    
                    const interweave = (arr1, arr2) => {
                      return arr1.reduce((acc, current, index) => {
                        return [
                          ...acc,
                          current,
                          ...arr2.splice(0, arr1[index + 1] ? 2 : arr2.length)
                        ];
                      }, []);
                    };
                    
                    console.log(interweave(a, [...z]));
                    console.log(z);

                    【讨论】:

                      【解决方案11】:

                      您也可以不使用任何forwhile!试试这个:

                      let a = ['y','y','y'];
                      let z = ['x','x','x','x','x'];
                      console.log(
                          [].concat.apply([], a.map(function(m, i){return [m].concat(z.slice(i*2, i*2+2));}))
                      );

                      现在你可以像这样加入结果:

                      let a = ['y','y','y'];
                      let z = ['x','x','x','x','x'];
                      console.log(
                          [].concat.apply([], a.map(function(m, i){return [m].concat(z.slice(i*2, i*2+2));})).join(",")
                      );

                      或者如果你喜欢reduce功能,你可以试试这个:

                      let a = ['y','y','y'];
                      let z = ['x','x','x','x','x'];
                      console.log(
                        a.reduce(function(ac, m, i){return ac.push.apply(ac, [m].concat(z.slice(i*2, i*2+2))), ac;}, [])
                      );

                      【讨论】:

                        猜你喜欢
                        • 2011-07-17
                        • 2012-01-22
                        • 2018-01-02
                        • 2013-01-24
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-07-03
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多