Загружаю объект map из json файла, но найти его размер не получается, выводит undefined

Загружаю json файл и записываю в объект Map. Потом хочу узнать размер объекта(то есть сколько там таймеров), но консоль выводит undefined.

Подскажите, пожалуйста, что я делаю не так.

вот код команда:

const Discord = module.require("discord.js");
const fs = require("fs");
let timer = new Map();
timer = require('../jsons/timer.json');
module.exports.run = async (bot, message, args) => {
    if (args[0] == 'amount') {
        let gld = message.member.guild.id;
        console.log(`На сервере ${timer[gld].length} таймеров.`);
    }
};
module.exports.help = {
    name: "timer"
};

вот json файл:

{
    "guild_id": {
        "1": {
            "time": 1000,
            "iteration": true,
            "author_nick": "nick",
            "author_id": "id"
        },
        "2": {
            "time": 10000,
            "iteration": true,
            "author_nick": "nick",
            "author_id": "id"
        }
    }
}

на месте guild_id стоит настоящий айди гильдии в дискорде.



Изменение в коде:

const Discord = module.require("discord.js");
const fs = require("fs");
let timer = new Map(
    Object.entries(
        require('../jsons/timer.json')
    )
);
module.exports.run = async (bot, message, args) => {
    if (args[0] == 'amount') {
        let gld = String(message.member.guild.id);
        console.log(`На сервере ${timer["guild_id"].size} таймеров.`);
    }
};
module.exports.help = {
    name: "timer"
};

Ответы (1 шт):

Автор решения: Grundy

Это так не работает:

let timer = new Map();
timer = require('../jsons/timer.json');

Результат, который возвращает require просто заменяет значение new Map(), таким образом, в переменной будет простой объект, а не Map.

Кроме того, у Map нет свойства length, есть свойство size


Чтобы на основе объекта сформировать Map, можно воспользоваться тем, что конструктор Map может принимать итерируемый объект.

Объект каждый элемент должен иметь вид: [key, value]

Для получения такого объекта можно воспользоваться методом Object.entries

В итоге код может выглядеть так:

let timer = new Map(
    Object.entries(
        require('../jsons/timer.json')
    )
);

Для получения значения по ключу, в Map используется метод get

Таким образом код должен получения такой

timer.get("guild_id")

Чтобы узнать количество свойств в объекте, нужно посмотреть количество ключей/значений либо просто в цикле посчитать.

метод Object.keys вернет массив ключей. Достаточно будет взять у него length

let timer = require('../jsons/timer.json');
...
console.log(`На сервере ${Object.keys(timer[gld]).length} таймеров.`);
→ Ссылка