基于现有子数组中的值创建新数组,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;
    
    因为(;iIf
    Bill
    等是字符串,它们需要用引号括起来。它们是字符串吗?您的
    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);