Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组切片()提供引用而不是值_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 数组切片()提供引用而不是值

Javascript 数组切片()提供引用而不是值,javascript,angular,typescript,Javascript,Angular,Typescript,我有一个导出对象的文件,如下所示: export const LINECHART2_DATA = { series: [{ data: [], name: 'HR', }, { etc... }] } import { LINECHART2_DATA } from '../chart-options/options'; 我是这样导入的: export const LINECHART2_DATA = {

我有一个导出对象的文件,如下所示:

export const LINECHART2_DATA = {
    series: [{
        data: [],
        name: 'HR',
    },
    { 
        etc...
    }]
}
import { LINECHART2_DATA } from '../chart-options/options';
我是这样导入的:

export const LINECHART2_DATA = {
    series: [{
        data: [],
        name: 'HR',
    },
    { 
        etc...
    }]
}
import { LINECHART2_DATA } from '../chart-options/options';
我有以下方法:

prepareLineChartDataContainer(bed: BedDetails) {
//Clear data to prepare for new bed
if (bed.seriesContainer == null) {
  bed.seriesContainer = LINECHART2_DATA.series.slice();
} else {
  bed.seriesContainer.forEach(series => {
    series.data.length = 0;
  });
}
//Add data to seriesContainer
this.vitalSigns.forEach(vs => {
  bed.timeWindows.forEach(tw => {
    bed.seriesContainer.find(series => series.name == vs).data.push(tw['avg' + vs]);
  });
});
}

正如您在上面看到的,我正在从
LINECHART2\u DATA
切片序列数组,然后将一些数据推送到其中。当一个新的
bed
被传递到带有空
seriesContainer
的方法中时,它将再次被切片,但这次它将包含以前的
bed
添加的数据。因为我使用的是
slice()
,所以我希望只获取
LINECHART2\u数据的值,而不是引用。我做错了什么?

为了防止复制数组的元素发生变异,您还应该创建项目的副本:

 bed.seriesContainer = LINECHART2_DATA.series.map((item=>Object.assign({}, item, {data: item.data.slice()}))
从:

切片不会改变原始数组。它返回 原始数组中的元素。原始数组的元素是 复制到返回的数组中,如下所示:

对于对象引用(而不是实际对象),切片复制对象 引用到新数组中原始数组和新数组都引用 指向同一对象。如果引用的对象发生更改,则更改为 新阵列和原始阵列都可见

对于字符串、数字和 布尔(不是字符串、数字和布尔对象),切片复制 将值放入新数组中。对中的字符串、数字或布尔值的更改 一个数组不影响另一个数组。如果将新元素添加到 无论是哪个阵列,另一个阵列都不受影响


因此,您看到的行为是slice的浅拷贝行为的结果。如果您需要一个深度副本,以便在不影响原始对象的情况下自由地修改对象,则需要手动执行此操作。展示几种方法。

slice()总是返回一个新数组,rtfm@dandavis不必粗鲁,为什么你认为我写了我希望得到一个新的数组?显然这不是我得到的,因为变异“新数组”也会变异我切片的原始数组。@Jesper是数组在变异,还是数组中的数据在变异?对不起,我是说搞笑。。。我看不到您对旧的或新的数组进行变异,只看到传递“byref”的元素。将阵列视为公共汽车,将乘客视为元素;他们可以登上新的巴士而不成为新的人。从
.slice
返回的数组是一个浅拷贝,这意味着当数组是新的时,新数组中的条目是指向与原始数组相同的对象的引用。因此,当你对它们进行变异时,它也会改变原始对象。我认为你的建议是有道理的,但没有奏效/丹达维斯是对的,我已经更正了我的代码。什么不起作用,Jesper?还添加了创建数组项数据副本的功能。无法说明您现在的功能是否有效,但我测试了您以前编写的代码,并且
LINECHART2_data
中的值仍在更改。谢谢,
bed.seriescanner=JSON.parse(JSON.stringify(LINECHART2_data.series))做到了。@Jesper,为什么不使用像lodash这样的库并使用它的函数呢。在lodash中,我们有u.deepClone()