Как предотвратить добавление дубликатов в объект JSON - PullRequest
0 голосов
/ 23 октября 2019

Использование Electron и электронное хранилище для добавления упрощенных имен исполняемых файлов и их полных путей из showOpenDialog в config.json. Выбор одного и того же файла вызывает повторяющиеся записи в config.json. По какой-то причине (или, скорее, отсутствует код), приложение считает, что это разные пути.

function addTool() {
    dialog.showOpenDialog({
            title: 'Select tool executable.',
            filters: [{
                name: 'Tool start file',
                extensions: ['exe', 'jar']
            }],
            properties: ['openFile']
        },
        (exeFromDialog) => {
            var var_exeToolPath = exeFromDialog.join(); //removes square brackets
            var var_toolName = path.basename(var_exeToolPath).split(/[/._-]/g)[0];
            //path.basename removes path until file, split+regex takes only first part until first character (one of ._/)

            const tools = appConfig.get('tools');
            const newTool = [...(tools || []), {
                "toolName": var_toolName,
                "toolPath": var_exeToolPath
            }];
            appConfig.set('tools', newTool);

        })
}

Так выглядит config.json, когда вы открываете один и тот же файл несколько раз:

{
    "winPosition": {
        "x": 1497,
        "y": 410,
        "width": 203,
        "height": 603
    },
    "exePOEPath": [
        "C:\\Program Files (x86)\\Grinding Gear Games\\Path of Exile\\PathOfExile_x64.exe"
    ],
    "tools": [
        {
            "toolName": "tool1",
            "toolPath": "D:\\tool1.exe"
        },
        {
            "toolName": "tool1",
            "toolPath": "D:\\tool1.exe"
        },
        {
            "toolName": "tool1",
            "toolPath": "D:\\tool1.exe"
        }
    ]
}

1 Ответ

0 голосов
/ 25 октября 2019

В конечном счете, возникает вопрос, как удалить дубликаты из вашего массива

Эта часть вашего кода всегда будет добавлять новое значение, она не проверяет дубликаты

const newTool = [...(tools || []), {
  toolName: var_toolName,
  toolPath: var_exeToolPath
}]

Так что это должно быть улучшено до следующего:

newTool = newTool.filter((item, pos, self) =>
  self.find(other => other.toolName === item.toolName) === item
)

Я бы предпочел использовать [...new Set([newTool])], но вы храните Object s, которые сравниваютсяссылка, таким образом, дубликаты не могут быть удалены с помощью Set

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...