我想从rename_fields集合中检索对象“main_object”以使用其字段值:
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(keyConfigurationkeyPluginConfiguration).forEach(function (keyRenameFields) {^
TypeError:无法将未定义或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 (内部/模块/cjs/loader.js:1137:30)
在Object.Module._extensions..js (内部/模块/cjs/loader.js:1157:10)
如何在具有特定类型的另一个对象中检索对象?
发布于 2020-08-09 16:42:41
我不知道为什么要使用如此嵌套的循环,但是为了获得rename_fields的值,请执行以下步骤:
最终您可以通过main_object.plugin_configuration.rename_fields
plugin_configuration类型被定义为PluginHandlerConfiguration .plugin_configuration可能是{ type: "not_required_configuration" } rename_fields,因为它没有这样的field- `plugin_configuration` may be `undefined`
- If so, you can't even access its `type` field所以理论准则是这样的:
// 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
}https://stackoverflow.com/questions/63306792
复制相似问题