如果我们的输出不仅包含一个值,还包含一个值数组?例如,我们正在返回保留图像列表的images
,我们如何使用uploadsUrl
函数返回它?
这是我们的文章要谈论的地方,任何形式的数组。
数组
这里的概念实际上很简单,我们只需检查值是否为数组,然后我们将其循环并应用其转换功能,否则只需将转换功能应用于值。
但是,由于我们已经进行了多次检查,例如valueType
是字符串,然后进行构建铸件,如果它的功能,则将其调用,如果是资源,则将其解析,所以让我们将所有这些检查组入所有这些检查一种方法,因此当值仅一个值或其数组时,我们可以调用它。
变换值
我们将创建一个新方法,我们将其称为transformValue
,它基本上将接收两个参数,即值和值类型,并且根据值类型,我们可以决定如何转换值。
// src/core/resources/resource.ts
// ...
/**
* Transform value
*/
protected transformValue(value: any, valueType: any) {
if (typeof valueType === "string") {
value = this.cast(value, valueType);
} else if (valueType.prototype instanceof Resource) {
value = new valueType(value);
} else if (typeof valueType === "function") {
value = valueType.call(this, value);
}
return value;
}
此方法基本上做了我们之前做过的完全相同的事情,但是我们只是以单独的方法将其移动。
您可能会注意到
valueType
如果它是一个函数,我将其更新以使用call
只是将资源对象绑定到this
中,如果值类型函数与当前资源类相关,则可以很有用。 p>
现在让我们更新我们的toJSON
方法以使用此新方法。
// src/core/resources/resource.ts
// ...
/**
* {@inheritDoc}
*/
public toJSON() {
// final output
const data: Record<string, any> = {};
// loop through the output property
for (const key in this.output) {
// get the value type
const valueType = this.output[key];
// get the value, and also make sure to skip the output property if it is missing from the given resource
let value = get(this.resource, key, missingKey);
// skip the output property if it is missing from the given resource
if (value === missingKey) {
continue;
}
// just for now sett the output value to the data
data[key] = this.transformValue(value, valueType);
}
return data;
}
我们替换了使用新方法transformValue
,这将首先使我们的代码清洁器,还允许我们在值为数组时使用该方法。
// src/core/resources/resource.ts
// ...
/**
* {@inheritDoc}
*/
public toJSON() {
// final output
const data: Record<string, any> = {};
// loop through the output property
for (const key in this.output) {
// get the value type
const valueType = this.output[key];
// get the value, and also make sure to skip the output property if it is missing from the given resource
let value = get(this.resource, key, missingKey);
// skip the output property if it is missing from the given resource
if (value === missingKey) {
continue;
}
// check if value is an array
if (Array.isArray(value)) {
value = value.map((item) => this.transformValue(item, valueType));
} else {
// transform single value
value = this.transformValue(value, valueType);
}
}
return data;
}
就是这样,现在我们可以传递一个值或单个值的列表,并不重要,它将始终相应地转换。
- 结论
我们在本文中做了两件事,我们创建了一个新方法transformValue
,它将转换一个值,我们还更新了我们的toJSON
方法以使用此新方法,还检查该值是否为数组,如果然后,我们将在它上循环并应用每个项目的转换。
â•给我买一杯咖啡。
如果您喜欢我的文章并看到对您有用,则可以buy me a coffee,它将帮助我继续前进并继续创建更多内容。
ð项目存储库
您可以在Github
上找到此项目的最新更新ð加入我们的社区
加入我们的社区Discord获得帮助和支持(节点JS 2023频道)。
ð视频课程(阿拉伯语)
如果您想以视频格式学习此课程,则可以在Youtube上找到该课程,该课程是阿拉伯语。
ð奖励内容ð
您可能会看这些文章,这肯定会提高您的知识和生产力。
一般主题
- Event Driven Architecture: A Practical Guide in Javascript
- Best Practices For Case Styles: Camel, Pascal, Snake, and Kebab Case In Node And Javascript
- After 6 years of practicing MongoDB, Here are my thoughts on MongoDB vs MySQL
软件包和库
- Collections: Your ultimate Javascript Arrays Manager
- Supportive Is: an elegant utility to check types of values in JavaScript
- Localization: An agnostic i18n package to manage localization in your project
React JS软件包
课程(文章)