Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как правильно заполнить массив данными (native javascript)? (https://javascript.ru/forum/dom-window/76501-kak-pravilno-zapolnit-massiv-dannymi-native-javascript.html)

s24344 17.01.2019 18:33

Как правильно заполнить массив данными (native javascript)?
 
Здравствуйте. Подскажите, пожалуйста, как правильно решить следующую задачу. У меня есть некая структура данных.
const data = [
  {
    locations: [
      {
        locationId: 0,
        players: [
          {
            holes: [
              {
                holeId: 1,
                score: 5
              },
              {
                holeId: 2,
                score: 5
              },
              {
                holeId: 3,
                score: 5
              },
              {
                holeId: 4,
                score: 5
              }
            ],
            firstName: "firstName 1",
            lastName: "lastName 1"
          },
          {
            holes: [
              {
                holeId: 1,
                score: 5
              },
              {
                holeId: 2,
                score: 5
              }
            ],
            firstName: "firstName 2",
            lastName: "lastName 2"
          },
          {
            holes: [
              {
                holeId: 1,
                score: 5
              }
            ],
            firstName: "firstName 3",
            lastName: "lastName 3"
          }
        ]
      }
    ]
  }
]

const players = data[0].locations[0].players;

players.forEach((item) => {
  console.log(item.holes);
  // [{...}, {...}, {...}, {...}]
  // 0: {holeId: 1, score: 5]
  // 1: {holeId: 2, score: 5]
  // 2: {holeId: 3, score: 5]
  // 3: {holeId: 4, score: 5]

  // [{...}, {...}]
  // 0: {holeId: 1, score: 5]
  // 1: {holeId: 2, score: 5]

  // [{...}]
  // 0: {holeId: 1, score: 5]
});

Мне необходимо сделать следующее: players может быть любое количество, и длина массива item.holes может быть различная. Мне необходимо, чтобы в массивы ориентировались по самому большому, и в случае, если их длина меньше, они заполнялись по следующему принципу. Например, у самого большого массива длина 4:
// [{...}, {...}, {...}, {...}]
// 0: {holeId: 1, score: 5]
// 1: {holeId: 2, score: 5]
// 2: {holeId: 3, score: 5]
// 3: {holeId: 4, score: 5]
А у остальных меньше, и необходимо, чтобы произошло следующее заполнение:
// например array номер 2
// [{...},{...}] // его длина изначально
// после преобразований
// 0: {holeId: 1, score: 5]
// 0: {holeId: 2, score: 5]
// 2: {score: '-']
// 3: { score: '-']

// например array номер 3
// [{...}] // его длина изначально
// после преобразований
// 0: {holeId: 1, score: 5]
// 1: {score: '-']
// 2: {score: '-']
// 3: { score: '-']

рони 17.01.2019 19:11

s24344,
const data = [
  {
    locations: [
      {
        locationId: 0,
        players: [
          {
            holes: [
              {
                holeId: 1,
                score: 5
              },
              {
                holeId: 2,
                score: 5
              },
              {
                holeId: 3,
                score: 5
              },
              {
                holeId: 4,
                score: 5
              }
            ],
            firstName: "firstName 1",
            lastName: "lastName 1"
          },
          {
            holes: [
              {
                holeId: 1,
                score: 5
              },
              {
                holeId: 2,
                score: 5
              }
            ],
            firstName: "firstName 2",
            lastName: "lastName 2"
          },
          {
            holes: [
              {
                holeId: 1,
                score: 5
              }
            ],
            firstName: "firstName 3",
            lastName: "lastName 3"
          }
        ]
      }
    ]
  }
]

const players = data[0].locations[0].players;
const length = players.reduce((max, item) => {
const {length} = item.holes;
return  Math.max(max,length);
},0);
const arr = Array.from(new Array(length), () => ({score: '-'}));

players.forEach((item) => {
  item.holes = Object.assign([], arr, item.holes)
  console.log(item.holes);
});

s24344 17.01.2019 19:13

Большое спасибо за помощь.

рони 17.01.2019 19:26

s24344,
const data = [
  {
    locations: [
      {
        locationId: 0,
        players: [
          {
            holes: [
              {
                holeId: 1,
                score: 5
              },
              {
                holeId: 2,
                score: 5
              },
              {
                holeId: 3,
                score: 5
              },
              {
                holeId: 4,
                score: 5
              }
            ],
            firstName: "firstName 1",
            lastName: "lastName 1"
          },
          {
            holes: [
              {
                holeId: 1,
                score: 5
              },
              {
                holeId: 2,
                score: 5
              }
            ],
            firstName: "firstName 2",
            lastName: "lastName 2"
          },
          {
            holes: [
              {
                holeId: 1,
                score: 5
              }
            ],
            firstName: "firstName 3",
            lastName: "lastName 3"
          }
        ]
      }
    ]
  }
]

const players = data[0].locations[0].players;
const length = players.reduce((max, item) => {
const {length} = item.holes;
return  Math.max(max,length);
},0);

players.forEach((item) => {
  const len = item.holes.length;
  item.holes.length = length;
  item.holes.fill({score: '-'}, len, length)
  console.log(item.holes);
});

Aetae 17.01.2019 20:20

рони, с fill надыть осторожно, вдруг он значение в поменять захочет внутри объекта.

рони 17.01.2019 20:53

Aetae,
ок.

рони 17.01.2019 21:00

:write:
const data = [
    {
        locations: [
            {
                locationId: 0,
                players: [
                    {
                        holes: [
                            {
                                holeId: 1,
                                score: 5
                            },
                            {
                                holeId: 2,
                                score: 5
                            },
                            {
                                holeId: 3,
                                score: 5
                            },
                            {
                                holeId: 4,
                                score: 5
                            }
                        ],
                        firstName: "firstName 1",
                        lastName: "lastName 1"
                    },
                    {
                        holes: [
                            {
                                holeId: 1,
                                score: 5
                            },
                            {
                                holeId: 2,
                                score: 5
                            }
                        ],
                        firstName: "firstName 2",
                        lastName: "lastName 2"
                    },
                    {
                        holes: [
                            {
                                holeId: 1,
                                score: 5
                            }
                        ],
                        firstName: "firstName 3",
                        lastName: "lastName 3"
                    }
                ]
            }
        ]
    }
]

const players = data[0].locations[0].players;
const length = players.reduce((max, item) => {
const {length} = item.holes;
return  Math.max(max,length);
},0);
const arr = Array.from(new Array(length), () => ({score: '-'}));

players.forEach((item) => {
    item.holes.push(...arr.slice(0));
    item.holes.length = length
    console.log(item.holes);
});


Часовой пояс GMT +3, время: 09:05.