Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.01.2019, 18:33
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 198

Как правильно заполнить массив данными (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: '-']
Ответить с цитированием
  #2 (permalink)  
Старый 17.01.2019, 19:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,556

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);
});
Ответить с цитированием
  #3 (permalink)  
Старый 17.01.2019, 19:13
Профессор
Отправить личное сообщение для s24344 Посмотреть профиль Найти все сообщения от s24344
 
Регистрация: 12.08.2015
Сообщений: 198

Большое спасибо за помощь.
Ответить с цитированием
  #4 (permalink)  
Старый 17.01.2019, 19:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,556

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);
});
Ответить с цитированием
  #5 (permalink)  
Старый 17.01.2019, 20:20
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,377

рони, с fill надыть осторожно, вдруг он значение в поменять захочет внутри объекта.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 17.01.2019, 20:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,556

Aetae,
ок.
Ответить с цитированием
  #7 (permalink)  
Старый 17.01.2019, 21:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,556


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);
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно сделать кодировку символов на JavaScript? Armen Общие вопросы Javascript 5 17.02.2015 17:57
Как правильно реализовать такой функционал? Julian Общие вопросы Javascript 3 16.01.2015 12:34
Как правильно писать модульные Javascript библиотеки? across Общие вопросы Javascript 3 15.10.2014 13:54
javascript обфускатор или как правильно скрыть код syegorius Общие вопросы Javascript 1 19.09.2012 02:58
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20