【发布时间】:2020-03-25 18:54:03
【问题描述】:
鉴于 EcmaScript 第 12.6.4 节:
被枚举对象的属性可能会在期间被删除 枚举。如果在此期间尚未访问的属性 枚举被删除,则不会被访问。
但是,看看这个案例:
class Lead {
MAPPINGS = [
[
/Medication_Types_(\d+)/,
(data, key, acc, i) => {
const values = Object.keys(data)
.filter( key => /Medication_Types_(\d+)/.test(key ))
.map(key => data[key]);
console.log('the values: ', values);
acc['Medication_Types'] = values;
Object.keys(data).forEach( key => {
if( /Medication_Types_(\d+)/.test(key)) delete data[key];
})
return i;
}
]
]
format(data) {
const copy = JSON.parse(JSON.stringify(data));
let mapping = false;
let i = 1;
const result = Object.keys(copy).reduce((acc, key) => {
mapping = false;
this.MAPPINGS.forEach( (mapping) => {
if(mapping[0].test(key)){
mapping[1](copy, key, acc, i);
mapping = true;
}
});
if(!mapping){
acc[key] = copy[key];
}
return acc;
}, {});
return result;
}
}
const data = {
"Gender" : "Male",
"Medication_Types_1" : "A",
"Medication_Types_2" : "B",
"First_Name" : "bob"
}
const lead = new Lead();
const result = lead.format(data);
console.log('the result: ', result);
它输出:
the values: [ 'A', 'B' ]
the values: []
the result: {
Gender: 'Male',
Medication_Types: [],
Medication_Types_1: undefined,
Medication_Types_2: undefined,
First_Name: 'bob'
}
如果键被真正删除,那么“值”就不会第二次打印出来,而是我会得到(以及我想要的)这个:
{
Gender: 'Male',
Medication_Types: ['A', 'B'],
First_Name: 'bob'
}
所以看起来delete 可能正在删除密钥,但不是从当前迭代中删除,但 EcmaScript 声明它将从当前迭代中删除!出了什么问题,我该如何解决?
【问题讨论】:
-
您引用的是哪个 EcmaScript 版本?在current revision 中,§12.6.2 与枚举无关。
-
@Bergi 我偶然引用了 5 而不是 6。但我假设如果它在 5 中,它会在 6 中。
-
当前版本是 10,枚举是通过那里的迭代器描述的 :-)
标签: javascript node.js ecmascript-6