我知道这个问题已经有了答案,但我想提供一个替代解决方案,您可能会觉得有帮助,我会解释原因。
答案:
您可以将Proxy 应用于每个对象并使用get 处理程序来测试属性的值是否能够强制to a number by using the + operator,而不是在users 数组上使用典型的transform。这是使用short-circuit evaluation 完成的,它返回第一个真表达式。如果一个属性的值不能转换为number,它将返回原始值而不强制(在本例中为string)。
users = users.map(_ =>
new Proxy(_, {get: (target, property) => +target[property] || target[property]}))
为什么有用?
代码将始终依赖于您的用例。在您的问题中,您询问了如何在您的 users 对象中将 user_id 转换为 number。如果这是一次性情况,您只需要将这个特定属性强制转换为数值,则不建议对您的对象应用代理。
然而
如果您发现自己有许多属性值希望尽可能转换为 number 类型,您可以考虑使用上述技术,这样您就不必精确定位和更新每个单独的转换函数中的属性名称。
注意:由于我们使用map 方法将我们的原始对象与Proxy 处理程序捆绑在一起,您可能需要使用不同的声明(var 或let ),或在您原来的 users 声明中使用 Array.from:
const users = Array.from(
[
{ user_id: '1', name: 'Jack'},
{ user_id: '2', name: 'Emma'},
{ user_id: '3', name: 'David'}
], _ => new Proxy(_, {get: (target, property) => +target[property] || target[property]}));
代码示例:
let users =
[{
user_id: '1',
name: 'Jack'
},
{
user_id: '2',
name: 'Emma'
},
{
user_id: '3',
name: 'David'
}
];
users = users.map(_ => new Proxy(_, { get: (target, property) => +target[property] || target[property]}))
users.forEach(({user_id, name}) => (console.log("user id: " + user_id + " is type: " + typeof user_id), console.log("name: " + name + " is type: " + typeof name)));