基于现有子数组中的值创建新数组,javascript
我有一个包含子阵列的数组,类似于:基于现有子数组中的值创建新数组,javascript,javascript,arrays,Javascript,Arrays,我有一个包含子阵列的数组,类似于: someArray = [[Bill, 1], [Ted, 2], [Steve, 2], [Alex, 3]] 我试图将每个子数组中的第一个值按与第二个值相同的次数推入一个新数组。因此,对于上面的示例,我希望它如下所示: newArray = [Bill, Ted, Ted, Steve, Steve, Alex, Alex, Alex] 我可以使用这些嵌套的for循环来访问子数组中的值,但这是我所能做到的: for (var i=0, len=data
someArray = [[Bill, 1], [Ted, 2], [Steve, 2], [Alex, 3]]
我试图将每个子数组中的第一个值按与第二个值相同的次数推入一个新数组。因此,对于上面的示例,我希望它如下所示:
newArray = [Bill, Ted, Ted, Steve, Steve, Alex, Alex, Alex]
我可以使用这些嵌套的for
循环来访问子数组中的值,但这是我所能做到的:
for (var i=0, len=data.length; i<len; i++) {
// inner loop applies to sub-arrays
for (var j=0, len2=data[i].length; j<len2; j++) {
// accesses each element of each sub-array in turn
names.push(data[i][j]);
//adds each element to a new array
for(var i=0,len=data.length;i您可以使用reduce
简洁地执行此操作,在每次迭代中将所需的项目数推送到累加器:
constsomearray=[['Bill',1],'Ted',2],'Steve',2],'Alex',3];
const output=someArray.reduce((a[repeatItem,repeatCount])=>{
a、 push(…Array.from({length:repeatCount},()=>repeatItem));
返回a;
}, []);
console.log(output);
@tdehnel,您使用的想法是正确的,只是它没有正确执行。只是一些小的更改
len2
不应该是data[i]
的长度,因为data[i]。长度是
始终为2,因为每个子阵列的长度为2。相反,您希望它为2
循环由每个循环的第二个元素表示的次数
我想是子数组,它是data[I][1]
。因此,len2=
数据[i][1]
正如@Amadan提到的,您应该推动data[i][0]
而不是data[i][j]
代码如下:
for (var i = 0, len = data.length; i < len; i++) {
// inner loop applies to sub-arrays
for (var j = 0, len2 = data[i][1]; j < len2; j++) {
// accesses each element of each sub-array in turn
names.push(data[i][0]);
//adds each element to a new array
for(变量i=0,len=data.length;i
否则,您也可以按照@CertainPerformance的建议去做,这也是一种简单的方法。如果您想使用解决方案本身,并且该解决方案已得到纠正,可以正常工作,您可以查看下面的代码及其与您自己的代码之间的差异:
var data = [["Bill", 1], ["Ted", 2], ["Steve", 2], ["Alex", 3]];
var names=[];
for (var i=0, len=data.length; i<len; i++)
for (var j=0; j<data[i][1]; j++)
names.push(data[i][0]);
console.log(names);
和reduce
版本:
var names=
someArray.reduce(function(a, d){
var i=0;
for(;i<d[1];i++) a.push(d[0]);
return a;
}, [])
console.log(names);
var名称=
someArray.reduce(函数(a,d){
var i=0;
因为(;iIfBill
等是字符串,它们需要用引号括起来。它们是字符串吗?您的data[i]
是一对,其[0]
是要重复的元素,其[1]
是要重复的数字;因此,不是len2=data[i]。长度,而是len2=data[i][1]
;不是names.push(数据[i][j])
,而是names.push(数据[i][0])
谢谢@Amadan,这正是我出错的地方。
var names=
someArray.reduce(function(a, d){
var i=0;
for(;i<d[1];i++) a.push(d[0]);
return a;
}, [])
console.log(names);