[英]Merge items from two arrays into a third array with a column subtracting the second index from the first
[英]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.