删除数组对象typescript / JavaScript的某些属性时出错

时间:2018-04-22 14:47:02

标签: javascript angular typescript

我有一个对象数组(firstList),现在我通过克隆数组firstList创建一个新数组(exportData),这个新数组我想要删除它的一些属性,我会做以下事情:

    let exportData = this.firstList;
    exportData = exportData.filter(function (props) {
      delete props.job;
      return true;
    });

在这里,我不明白为什么即使我的旧数组也删除了这些属性,由于机制或我做错了什么?

Plunker

5 个答案:

答案 0 :(得分:2)

您没有创建数组的副本,而是创建对同一数组的新引用。您需要创建一个新数组并使用对象的副本填充if,如boran的答案。

答案 1 :(得分:1)

var x = Number(prompt("Ingrese un número"));
var contador = 1;

while (contador <= x) {

  console.log(contador + x);

  contador++;
}

答案 2 :(得分:1)

filter在这里被滥用,因为它实际上没有过滤任何东西,只是迭代数组元素。对于数组迭代,应使用通用循环(forfor..offorEach)。

这里的问题是没有克隆props个对象。修改后,更改会出现在每个使用过的地方。

应该将数组映射到省略job属性的对象的浅副本。这可以通过传播和休息语法来完成:

exportData = exportData.map(({ job, ...props}) => ({...props}));

答案 3 :(得分:0)

exportData是firstList的引用。所以当在exportData中更改某些内容时,它们将反映在firstList中。所以,你需要克隆数组。

你可以这样做:

let exportData = [];
for(var i =0; i < this.firstList.length; i++){
  exportData[i] = this.firstList[i];
}
exportData = exportData.filter(function (props) {
  delete props.job;
  return true;
});

这只是一个提示。

答案 4 :(得分:0)

您的代码按照应有的方式运行。

 let exportData = this.firstList;

你没有创建一个新数组,你只是创建了一个对同一个数组的引用,使用哪个引用执行操作并不重要,因为它们都指的是同一个数组。

如果您尝试以这种方式克隆,它将是两个不同的数组,另一个副本,如果对exportData有任何更改,firstList将不会受到影响。

let exportData = JSON.parse(JSON.stringify(this.firstList));