重复数组项x基于每个数组项内的值的次数

时间:2018-10-15 19:55:04

标签: javascript arrays

我正在使用javascript,并尝试根据每个项目内的匹配项数量来复制数组项目。我相信我需要使用arr.map()完成此操作,但是在评估逻辑上遇到了麻烦。

因此,在下面的示例中,项目1将重复3次,项目2将重复1次。感谢您的帮助和时间。

我当前的数组如下:

"cards" = [
    {
        "text": "Item 1"
        "matches": 3
    }
    {
        "text": "Item 2"
        "matches": 1
    }
]

新数组看起来像:

"newCards" = [
    {
        "text": "Item 1"
        "matches": 3
    }
    {
        "text": "Item 1"
        "matches": 3
    },
    {
        "text": "Item 1"
        "matches": 3
    },
    {
        "text": "Item 2"
        "matches": 1
    },
    {
        "text": "Item 2"
        "matches": 1
    }
]

试图使用地图功能

let cardCounter = 0

let cardMap = cards.map(function (item){
cardCounter++
if (cardCounter < item.matches) {
 // Not really sure what to return here....
 // tried to return
 // return[item, item]
 // this returns an array where the first two keys are arrays and the rest undefined.
}

})

2 个答案:

答案 0 :(得分:1)

我认为map并不是一个好选择,因为它执行一个值到一个值的映射。如果有可用的破折号,则可以使用flatMap,在这种情况下,您的return[item, item]想法会起作用。如果不是,那么可以使用reduce。像这样:

let cardMap = cards.reduce(function (acc, item){
      for (let i = 0; i < item.matches; i++) {
             acc.push(item);
      }
      return acc;
}, []);

答案 1 :(得分:0)

如何?

var cards = [
    {
        "text": "Item 1",
        "matches": 3
    },
    {
        "text": "Item 2",
        "matches": 1
    }
]

var newCardsArray = [];

cards.forEach(function(element) {
    for(i = 0; i < element.matches; i++) {
        newCardsArray.push(element);
    }
});

console.log(newCardsArray);