Переменная в JSON Path - JavaScript - PullRequest
0 голосов
/ 20 июня 2019

Я уже искал похожие проблемы, но пока не нашел ничего, что могло бы мне помочь.

Я пытаюсь найти путь к изображению (используя формат JSON) в зависимости от типа материала выбранного элемента. На самом деле мой код построен так:

if (globalData.Material.Mat_type == "OSCILLOSCOPE") {                                                         
  var picture = (globalData.Material.Oscilloscope.picture);                     
}
if (globalData.Material.Mat_type == "ALIMENTATION") {                                                         
  var picture = (globalData.Material.Alim.picture);                     
}

Но не оптимизирован совсем, поэтому я пытаюсь сделать это так:

var mat_type = (globalData.Material.Mat_type);

var picture = (globalData.Material[mat_type].picture);

Но это не сработает ... Есть исключение:

TypeError: globalData.Material [mat_type] не определено.

Я уже много чего перепробовал, у тебя есть идеи? Спасибо!

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Проблема решена

Питер Вольф был прав!Это была проблема с учетом регистра

Я на самом деле не знаю, как продвигать его комментарий, извините за это ..

В любом случае, спасибо, ребята!

0 голосов
/ 20 июня 2019

Я обрисовал проблему с регистром символов в комментарии под вопросом, так что, предположительно, корректировка значения 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"
  }
}));

Примечание: во избежание головной боли, возможно, вам следует предпочесть оператор строгого равенства вместо оператора свободного равенства .

0 голосов
/ 20 июня 2019
var mat_type = (globalData.Material.Mat_type);
if(mat_type!==undefined)
 var picture = (globalData.Material[mat_type].picture)

Просто выполните экзистенциальную проверку, прежде чем получить доступ к значению, для ключей, которые могут отсутствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...