循环中的Javascript对象属性不删除

时间:2018-04-19 16:55:03

标签: javascript typescript

我无法理解此javascript代码的行为。

const devices = searchResult.results.forEach(device => {
    const temp = Object.keys(device.fields);

    for(var property in temp) {
        if(device.fields.hasOwnProperty(property)) {
            if (!usedPropertiesAcrossModels.has(property)) {
                delete device.fields[property];
            }
        }
    }
}

如果javascript对象不属于某个集合,我试图删除这些键。我已经逐步完成了调试器,我知道集合中只有一个元素,device.fields中只有15个元素。无论如何,从device.fields中删除任何内容,我都不知道为什么。此外,temp似乎未定义,直到我离开循环。即使临时文件中有项目,Property也始终未定义!这没有任何意义。

2 个答案:

答案 0 :(得分:0)

<div #myList>
 <div *ngFor="let item of items; let last = last">
  {{item.title}}
  {{last ? scrollToBottom() : ''}}
 </div>
</div>

scrollToBottom() {
 this.myList.nativeElement.scrollTop = this.myList.nativeElement.scrollHeight;
}

使用map修复了问题,就像在你的情况下,for in给出了索引而不是对象的键。或者像马丁所说的那样你可以考虑使用for。

答案 1 :(得分:-1)

const temp = Object.keys(o)将为您提供对象数组的键。您应该使用for of循环而不是for in,因为您需要迭代它的值,而不是temp对象中的键:

const o = { a: 1, b: 2, c: 3 };
const temp = Object.keys(o);
console.log(temp);

// this will iterate through `temp` keys, so 0, 1, 2
for (const property in temp) {
  console.log('wrong:', property); 
}

// this will iterate through `temp` values, so 'a', 'b', 'c'
for (const property of temp) {
  console.log('correct:', property);
}

// or you could iterate via `forEach()`
temp.forEach(property => {
  console.log('correct:', property);
});

同样使用for of循环,您不需要hasOwnProperty检查。