Я обрисовал проблему с регистром символов в комментарии под вопросом, так что, предположительно, корректировка значения globalData.Material.Mat_type
может помочь:
var mat_type =
globalData.Material.Mat_type.charAt(0).toUpperCase() +
globalData.Material.Mat_type.substr(1).toLowerCase();
Я также вижу, что это общее правило может быть применимо не во всех случаях. Если это не опечатка, она не будет работать для второго случая, когда Mat_type == "ALIMENTATION"
, потому что тогда вы пытаетесь получить доступ к свойству Alim
Material
вместо Alimentation
. В этом случае вы можете получить доступ к свойству по префиксу:
function pictureOf(material) {
if (!material || !String(material.Mat_type)) {
return null;
}
let mat_type = String(material.Mat_type).toUpperCase();
for (var propertyName in material) {
if (mat_type.startsWith(propertyName.toUpperCase())) {
return material[propertyName].picture || null;
}
}
return null;
}
console.log(pictureOf({
Mat_type: "OSCILLOSCOPE",
Oscilloscope: {
picture: "picture of oscilloscope"
}
}));
console.log(pictureOf({
Mat_type: "ALIMENTATION",
Alim: {
picture: "picture of alimentation"
}
}));
Но такой подход может быть подвержен ошибкам, если несколько свойств имеют один и тот же префикс. Существует также скрытая проблема с сопоставлением регистронезависимого префикса в случае, если вы используете некоторые специальные символы Юникода в именах свойств. Наконец, этот метод неэффективен, потому что он должен перебирать все свойства объекта (в худшем случае). Его можно заменить более безопасным сопоставлением свойств:
const matTypeMapping = {
"ALIMENTATION": "Alim"
};
function pictureOf(material) {
if (!material || !String(material.Mat_type)) {
return null;
}
let matType = String(material.Mat_type);
// find property mapping or apply general rule, if mapping not defined
let propertyName = matTypeMapping[matType] ||
matType.charAt(0).toUpperCase() + matType.substr(1).toLowerCase();
return material[propertyName].picture || null;
}
console.log(pictureOf({
Mat_type: "OSCILLOSCOPE",
Oscilloscope: {
picture: "picture of oscilloscope"
}
}));
console.log(pictureOf({
Mat_type: "ALIMENTATION",
Alim: {
picture: "picture of alimentation"
}
}));
Примечание: во избежание головной боли, возможно, вам следует предпочесть оператор строгого равенства вместо оператора свободного равенства .