【问题标题】:Returns an array that consists of: one first item, two second items, tree third items etc. withour using loops返回一个数组,该数组包含:一个第一项、两个第二项、树第三项等。不使用循环
【发布时间】:2019-04-10 17:18:20
【问题描述】:

我正在做一个赋值,要求将给定数组转换为新数组,以便新数组由一个第一项、两个第二项、树第三项等组成。不使用循环,只是特定于数组方法。例如:

[] => []
[ 1 ] => [ 1 ]
[ 'a', 'b' ] => [ 'a', 'b','b' ]
[ 'a', 'b', 'c', null ] => [ 'a', 'b','b', 'c','c','c',  null,null,null,null ]

我已经通过使用 .map 和递归解决了这个问题。函数如下所示:

function propagateItemsByPositionIndex(arr) {
    let newArray = [];
    let additions = 0;
    arr.map(function (k, x) {
        createArray(k, x);
        additions = 0;
    });
    return newArray
    function createArray(item, count) {
        if (additions <= count) {
            newArray.push(item);
            ++additions
            createArray(item, count);
        }
    }
}

感觉应该有更好的方法来做到这一点。

【问题讨论】:

    标签: javascript arraylist


    【解决方案1】:

    let array1 = [ 1 ] 
    let array2 =  [ 'a', 'b' ]
    let array3 = [ 'a', 'b', 'c', null ] 
    
    let array = [ 'a', 'b' ]
    
    function transformArray(array){
      return array.reduce(
        (acc, curr, idx)=>{
          //Creating an array of length equal to index+1 
          [...Array(idx+1)].forEach(item => acc[acc.length] = curr)
          return acc
        },
       []
      )
    }
    console.log(transformArray(array1))
    console.log(transformArray(array2))
    console.log(transformArray(array3))

    【讨论】:

      【解决方案2】:

      您可以使用Array.reduce() 并使用索引和值创建一个具有指定长度并为每个项目填充所需值的新数组,然后使用Array.push() 和扩展运算符将它们全部合并为一个数组,像这样:

      arr0 = [];
      arr1 = [1];
      arr2 = ['a', 'b'];
      arr3 = ['a', 'b', 'c', null];
      
      function propagateItemsByPositionIndex(arr) {
        if (arr.length == 0 || arr.length == 1) return arr;
        return arr.reduce((acc, v, i) => {
          acc.push(...Array(i + 1).fill(v));
          return acc;
        }, []);
      }
      
      console.log(propagateItemsByPositionIndex(arr0));
      console.log(propagateItemsByPositionIndex(arr1));
      console.log(propagateItemsByPositionIndex(arr2));
      console.log(propagateItemsByPositionIndex(arr3));

      【讨论】:

        【解决方案3】:

        您可以使用即将推出的Array#flatMap,它是一个映射函数,可以平展第一级数组值。

        这实际上只在 Chrome 或 FF 中有效(参见 Browser compatibility)。

        const theFn = array => array.flatMap((v, i) => Array.from({ length: i + 1 }).fill(v));
        
        console.log(theFn([1, 2, 3, null]));

        【讨论】:

          【解决方案4】:

          一种选择是使用reduce 和concat 到数组累加器一个由重复i + 1 次的迭代项组成的数组,其中i 是该项的索引:

          const transform = arr => arr.reduce((a, item, i) => (
            a.concat(Array.from(
              { length: i + 1 },
              () => item
            ))
          ), []);
          
          console.log(transform([]));
          console.log(transform([1]));
          console.log(transform(['a', 'b']));
          console.log(transform([ 'a', 'b', 'c', null ]));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-10
            • 2021-01-11
            • 1970-01-01
            • 2022-11-12
            • 2012-03-31
            • 1970-01-01
            相关资源
            最近更新 更多