繁体   English   中英

返回一个数组,该数组包含:一个第一项,两个第二项,树第三项等,使用循环

[英]Returns an array that consists of: one first item, two second items, tree third items etc. withour using loops

我做一个分配,要求给定数组转换为新数组,以便新数组由一个第一项,两个第二项,树的第三项等组成, 而无需使用循环 ,而仅使用数组特定方法。 例如:

[] => []
[ 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);
        }
    }
}

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

一个选择是使用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 ])); 

您可以使用即将到来的Array#flatMap ,它是一个映射函数,用于平整数组值的第一级。

这实际上仅在Chrome或FF中有效(请参阅浏览器兼容性 )。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM