
本文将详细介绍如何在JavaScript中将具有非标准或任意键名的JSON对象映射到预定义类的特定属性。通过利用ES6的解构赋值与属性重命名功能,我们可以高效、清晰地实现数据转换,确保JSON数据能够准确填充到目标类的实例中,从而提高代码的可读性和可维护性。
在实际开发中,我们经常会从外部接口或文件接收到JSON格式的数据。这些数据的键名可能并不总是与我们内部定义的类结构完全匹配。例如,我们可能收到以下形式的JSON数组:
var inputJson = [{
"HS": " ",
"__EMPTY": 1,
"__EMPTY_1": " Pcs."
},
{
"HS": " RAS222PCAIBA",
"__EMPTY": 1,
"__EMPTY_1": " Pcs."
},
{
"HS": " SRK20CSS-S6/A1.6T",
"__EMPTY": -4,
"__EMPTY_1": " Pcs."
}];而我们期望将其映射到一个名为 Stocks 的类实例数组中,该类的定义如下:
class Stocks {
model;
quantity;
type;
constructor(data) {
Object.assign(this, data);
}
}我们希望将 inputJson 中的 HS 键映射到 Stocks 类的 model 属性,__EMPTY 键映射到 quantity 属性,__EMPTY_1 键映射到 type 属性。
如果直接使用 Object.assign(this, data),如以下尝试:
var completeStock = [];
$.each(inputJson, function( index, value ) {
completeStock.push(new Stocks(value));
});这将导致 Stocks 实例直接拥有 HS、__EMPTY 和 __EMPTY_1 等属性,而不是我们期望的 model、quantity 和 type。这是因为 Object.assign 会将源对象的属性直接复制到目标对象,而不会进行键名转换。
为了解决上述问题,我们可以利用ES6的解构赋值(Destructuring Assignment)功能,结合属性重命名(Property Renaming)语法,在将JSON对象的值传递给类构造函数之前,先将其转换为符合类属性命名规范的对象。
核心思想: 在迭代 inputJson 数组时,对于每个JSON对象 value,我们使用解构赋值语法 const { oldKey: newKey, ... } = value; 来提取并重命名其属性。然后,将重命名后的属性组成一个新的对象,传递给 Stocks 类的构造函数。
以下是实现这一目标的代码:
// 原始输入JSON数据
var inputJson = [{
"HS": " ",
"__EMPTY": 1,
"__EMPTY_1": " Pcs."
},
{
"HS": " RAS222PCAIBA",
"__EMPTY": 1,
"__EMPTY_1": " Pcs."
},
{
"HS": " SRK20CSS-S6/A1.6T",
"__EMPTY": -4,
"__EMPTY_1": " Pcs."
}];
// 目标类定义
class Stocks {
model;
quantity;
type;
constructor(data) {
// 使用Object.assign将传入的数据映射到类实例
// 前提是data对象的键名已与类属性匹配
Object.assign(this, data);
}
}
// 存储映射后的Stock对象数组
var completeStock = [];
// 遍历inputJson数组并进行映射
$.each(inputJson, function(index, value) {
// 使用解构赋值并重命名属性
// HS 键的值赋给 model 变量
// __EMPTY 键的值赋给 quantity 变量
// __EMPTY_1 键的值赋给 type 变量
const { HS: model, __EMPTY: quantity, __EMPTY_1: type } = value;
// 创建一个新的Stocks实例,传入重命名后的属性组成的字面量对象
completeStock.push(new Stocks({ model, quantity, type }));
});
// 打印结果,查看映射是否成功
console.log(completeStock);
/*
预期输出 (类似):
[
Stocks { model: ' ', quantity: 1, type: ' Pcs.' },
Stocks { model: ' RAS222PCAIBA', quantity: 1, type: ' Pcs.' },
Stocks { model: ' SRK20CSS-S6/A1.6T', quantity: -4, type: ' Pcs.' }
]
*/const { HS: model, __EMPTY: quantity, __EMPTY_1: type } = value;
new Stocks({ model, quantity, type })
const { HS: model = 'N/A', __EMPTY: quantity = 0, __EMPTY_1: type = 'Unknown' } = value;const completeStock = inputJson.map(value => {
const { HS: model, __EMPTY: quantity, __EMPTY_1: type } = value;
return new Stocks({ model, quantity, type });
});通过结合ES6的解构赋值和属性重命名语法,我们可以优雅而高效地解决JSON对象键名与目标类属性名不匹配的问题。这种方法不仅提高了代码的可读性和简洁性,也使得数据转换过程更加直观和易于维护。在处理结构化但键名不一致的JSON数据时,这是一种非常推荐的实践。
以上就是将JSON对象映射到具有不同键名的类属性的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号