Typescript - 在另一个对象中检索一个对象
Posted
技术标签:
【中文标题】Typescript - 在另一个对象中检索一个对象【英文标题】:Typescript - Retrieve an object inside another object 【发布时间】:2020-11-28 02:04:07 【问题描述】:我想从 main_object 集合中检索对象“rename_fields”以使用其字段值:
export interface StdMap<T = string>
[key: string]: T;
export type StdFileBasedPluginHandlerConfiguration<
SourceType extends StdMap<string | number>
> =
type: "std_file";
data_files: string[];
exclude_fields: string[];
value_fields: string[];
rename_fields: StdMap<StdMap<string>>;
descriptor: string;
;
export type PluginHandlerConfiguration =
| StdFileBasedPluginHandlerConfiguration<any>
| type: "not_required_configuration"
| undefined;
// export type PluginHandlerConfiguration = StdFileBasedPluginHandlerConfiguration<
// any
// >;
export interface CollectorConfiguration
lastUpdate: Date;
hashFile: string;
code: string;
plugin_path?: string;
plugin_configuration: PluginHandlerConfiguration;
related_codes?: string[];
collections: original: string; names: string[] ;
skipCollectData?: boolean;
skipFlatGeneration?: boolean;
extra_grouping_fields: string[];
has_origins: boolean;
force?: boolean;
notify?: boolean;
origins_that_generate_extra_records?: string[];
const main_object: CollectorConfiguration=
"code" : "my_code",
"lastUpdate" : new Date("2020-01-28T00:00:00.000+0000"),
"collections" :
"original" : "collection",
"names" : [
"collection_1",
"collection_2"
]
,
"hashFile" : "ffc0b10ac2e7cd681f5666a474063165f5507212c45abf4ee2f85482ea866985,13c1dd232e13bc6d20ffe6213f38c5152e1f5e7f72366b461602d3cd876ef40f",
"extra_grouping_fields" : [
"type"
],
"has_origins" : true,
"plugin_path" : "file/path_to_plugin",
"plugin_configuration" :
"type" : "std_file",
"data_files" : [
"../file1.csv",
"../file2.csv"
],
"value_fields" : [
"value1",
"value2"
],
"descriptor" : "type",
"exclude_fields" : [
"excl1",
"excl2"
],
"rename_fields" :
"flat" :
"TEST1" : "test1",
"TEST2" : "test2",
Object.keys(main_object).forEach((key: Date | string | StdFileBasedPluginHandlerConfiguration<any> | boolean)=>
console.log(`KEY: $key - typeof key: $typeof key`);
Object.keys(main_object).forEach((keyConfiguration) =>
console.log(`DEBUG-->configuration keys: $keyConfiguration`);
if (keyConfiguration === "plugin_configuration")
Object.keys(main_object[keyConfiguration]!).forEach(
(keyPluginConfiguration: any) =>
console.log(
`DEBUG-->plugin_configuration - $keyPluginConfiguration --- END plugin_configuration`
);
if (keyPluginConfiguration === "rename_fields")
Object.keys(
keyConfiguration![keyPluginConfiguration]!
).forEach((keyRenameFields: any) =>
console.log(
`DEBUG-->rename_fields - $keyRenameFields --- END rename_fields`
);
);
);
);
);
但我遇到了错误:
test_object_loop.js:50 Object.keys(keyConfiguration[keyPluginConfiguration]).forEach(function (keyRenameFields) ^ TypeError:无法将 undefined 或 null 转换为对象 在 Function.keys () 在 test_object_loop.js:50:28 在 Array.forEach () 在 test_object_loop.js:47:56 在 Array.forEach () 在 test_object_loop.js:44:30 在 Array.forEach () 在对象。 (test_object_loop.js:42:26) 在 Module._compile (internal/modules/cjs/loader.js:1137:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
如何在具有特定类型的另一个对象中检索一个对象?
【问题讨论】:
【参考方案1】:我不知道你为什么使用如此嵌套的循环,但为了获得rename_fields
的值,请按照以下步骤操作:
-
最终您可以通过
main_object.plugin_configuration.rename_fields
访问该值
因为plugin_configuration
的类型被定义为PluginHandlerConfiguration
然而...
plugin_configuration
可能是 type: "not_required_configuration"
如果是这样,您将无法访问其rename_fields
,因为它没有这样的字段
plugin_configuration
可能是 undefined
如果是这样,您甚至无法访问其type
字段
所以理论上的代码应该是这样的:
// Make sure `plugin_configuration` is not undefined
if (main_object.plugin_configuration)
// Make sure `plugin_configuration` has `rename_fields` field
// by checking `type` field is "std_file"
if (main_object.plugin_configuration.type === "std_file")
// Now you can safely access `rename_fields`
const renameFields = main_object.plugin_configuration.rename_fields
这两个if
条件可以组合,如下面更简单实用的代码:
if (main_object.plugin_configuration && main_object.plugin_configuration.type === "std_file")
const renameFields = main_object.plugin_configuration.rename_fields
【讨论】:
以上是关于Typescript - 在另一个对象中检索一个对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 html 链接检索 JSON 对象并在另一个 html 页面上显示 json 数据
Angular 指令使用 Typescript 接收对象作为属性