Как я могу обновить массив без обновления базового массива - PullRequest
0 голосов
/ 13 февраля 2020
  mapConfig(config: IConfigItem[], dataModel: IDataModel): IConfigItem[] {
    return config.map(c => {
      const entries: [string, string][] = Object.entries(c);
      entries.forEach(e => {
        const configValue = e[0];
        const configKey = e[1];
        if (configKey in dataModel) {
          c[configValue] = dataModel[configKey];
        }
      });
      return { ...c };
    });
  }

У меня есть эта функция в классе обслуживания, и я вызываю этот метод из моего angular компонента.

  const configCopy = [...this.config];
    const dataModelCopy = { ...this.dataModel };
    const mappedConfig: IConfigItem[] = this.loader.mapConfig(
      configCopy,
      dataModelCopy
    );

Я создаю копию объекта this.config и передаю это функция mapconfig, чтобы он не обновлял базовый объект (this.config), но всегда обновляет базовый объект this.config. Не уверен, что я делаю что-то не так.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Это должно быть выполнимо без единой мутации, более или менее так:

mapConfig(config: IConfigItem[], dataModel: IDataModel): IConfigItem[] {
    return config.map(c => {
        const entries: [string, string][] = Object.entries(c);
        const entriesToBeReplaced = entries.filter(([val, key]) => key in dataModel);

        const entriesWithReplacedValues = entriesToBeReplaced.map(([val, key]) => ({
            [val]: dataModel[key]
        }));

        return {
            ...c,
            Object.fromEntries(entriesWithReplacedValues)
        };
    });
}
1 голос
/ 13 февраля 2020

Разрушение делает поверхностную копию объектов. Это означает, что внутренние объекты будут одинаковыми для копии и оригинала. Вам нужно какое-то глубокое клонирование.

Самый простой (не лучший) способ - это упорядочить оригинал:

const configCopy = JSON.parse(JSON.stringify(this.config));

Как выполнить глубокое клонирование в javascript

...