Как работать с многоуровневыми данными?

142
16 октября 2019, 22:30

Например, если у меня есть дома, в которых есть комнаты, в которых есть стулья, как мне организовать структуру данных, чтобы было удобнее с ними работать(удалять добавлять, менять порядок, изменять)? Самый простой вариант создать массив из объектов домов, в каждом объекте по массиву комнат, в каждой комнате по массиву стульев. Но это ведь жутко неудобно.

Answer 1

Но это ведь жутко неудобно.

Напишите функции-хелперы, вызвав которые Вы сможете обратиться к нужному дому, или комнате, или стулу (в понятном человеку виде):

const houses = [{ // многоуровневые данные (дома, квартиры, стулья) 
  name: '1/52 А', 
  rooms: [{ 
    name: '10', 
    chairs: ['Стул 1', 'Стул 2'] 
  }] 
}, { 
  name: '6', 
  rooms: [{ 
    name: '10', 
    chairs: ['Стул 1', 'Стул 2', 'Стул 3'] 
  }, { 
    name: '11', 
    chairs: ['Стул 1', 'Стул 2', 'Стул 3', 'Стул 4'] 
  }] 
}, { 
  name: '3 корп. 4', 
  rooms: [{ 
    name: '55', 
    chairs: ['Стул 1'] 
  }] 
}]; 
 
console.log('Дом:', getHouseByName('1/52 А')); 
 
console.log('Комната:', getRoomByName('6', '11')); 
 
console.log('Стул:', getChairByName('3 корп. 4', '55', 'Стул 1')); 
 
console.log('Стулья:', getAllChairs('6', '10')); 
 
// функции-хелперы 
 
function getHouseByName(houseName) { // получаем нужный дом 
  return houses.find((el) => el.name === houseName); 
} 
 
function getRoomByName(houseName, roomName) { // получаем нужную квартиру 
  return getHouseByName(houseName).rooms.find((el) => el.name === roomName); 
} 
 
function getChairByName(houseName, roomName, chairName) { // получаем нужный стул 
  return getAllChairs(houseName, roomName).find((el) => el === chairName); 
} 
 
function getAllChairs(houseName, roomName) { // получаем все стулья 
  return getRoomByName(houseName, roomName).chairs; 
}

Answer 2
<script>
    const ArrayHouse = [
        {
            name: 'house1',
            rooms: [
                {
                    number: 3,
                    chairs: [
                        {
                            color: 'red',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'red',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'red',
                            height: 10,
                            width: 45
                        }
                    ]
                },
                {
                    number: 1,
                    chairs: [
                        {
                            color: 'green',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'black',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'violet',
                            height: 10,
                            width: 45
                        }
                    ]
                }
            ]
        },
        {
            name: 'house2',
            rooms: [
                {
                    number: 3,
                    chairs: [
                        {
                            color: 'red',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'red',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'red',
                            height: 10,
                            width: 45
                        }
                    ]
                },
                {
                    number: 1,
                    chairs: [
                        {
                            color: 'green',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'black',
                            height: 10,
                            width: 45
                        },
                        {
                            color: 'violet',
                            height: 10,
                            width: 45
                        }
                    ]
                },
                {
                    number: 15,
                    chairs: [
                        {
                            color: 'green',
                            height: 102,
                            width: 45
                        },
                        {
                            color: 'white',
                            height: 110,
                            width: 45
                        },
                        {
                            color: 'violet',
                            height: 150,
                            width: 45
                        }
                    ]
                }
            ]
        }
    ]
    class HouseContext {
        constructor() {
            console.log(this.getHouseByName('house1'));
            this.addHouse({
                name: 'addHouse',
                rooms: []
            });
            console.log(ArrayHouse);
            console.log(this.getRoomBuNumber('house2', 1));
            this.addRoom('addHouse', {
                number: 228,
                chairs:[]
            });
            console.log(ArrayHouse);
        }
        getHouseByName(name) {
            return ArrayHouse.find(v => v.name == name);
        }
        addHouse(house) {
            ArrayHouse.push(house);
        }
        getRoomBuNumber(houseName, roomNumber) {
            return ArrayHouse.find(v => v.name == houseName).rooms.find(v => v.number == roomNumber);
        }
        addRoom(houseName, room) {
            ArrayHouse.find(v => v.name == houseName).rooms.push(room);
        }
    }
    new HouseContext();

</script>
READ ALSO
Как вывести данные в react в несколько строк

Как вывести данные в react в несколько строк

Есть входные данные такого вида:

114
Замена src у video, которое рисуется в canvas

Замена src у video, которое рисуется в canvas

Есть canvas, который рисует videoЯ хочу поменять источник видео и пока делаю это просто изменением атрибута src

152
SQL запрос в Excel на GO, оптимизация

SQL запрос в Excel на GO, оптимизация

Мне нужно сформировать отчет Excel и скачать егоДанные берутся из SQL ( примерно 200 тысяч строк на 70 столбиков)

111