如何在不更新基本数组的情况下更新数组

How can i update an array without updating the base array

  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 };
    });
  }

我在服务 class 中有这个功能,我从我的 angular 组件调用这个方法。

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

我正在创建 this.config 对象的副本并将其传递给 mapconfig 函数,这样它就不会更新基础对象 (this.config),但它总是会更新基础对象 this.config。不确定我是否做错了什么。

解构是对象的浅拷贝。这意味着副本和原始对象的内部对象是相同的。你需要某种深度克隆。

最简单(不是最好)的方法是将原文字符串化:

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

How to Deep clone in javascript

应该可以不做任何突变,大致是这样的:

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)
        };
    });
}