JS - объект содержит имя массива - PullRequest
0 голосов
/ 31 января 2020

У меня есть следующая задача:

У меня есть объект, который содержит данные из внутренних проектов. Некоторые проекты оплачиваются, а некоторые нет. Эти данные собираются из API в Google Spreadsheets, которые хотели бы поместить sh в массив, чтобы я мог отобразить их на своих листах.

Когда проект [i] не является оплачиваемым проектом jsonObject.data[i].budget.hours.amount_budget] не будет в объекте. и поэтому он вернет ошибку.

Есть ли способ спросить в Javascript / AppScript, содержит ли элемент массива budget.hours.amount_budget для элемента `[i]?

Заранее спасибо

  var i = 0  
  var arrayProjectManagerName = [];
  var arrayOrganizationName = [];  
  var arrayProjectName = [];    
  var arrayBudgetHoursAmountBudget = [];
  var arrayBudgetHoursAmountSpent = [];
  var arrayBudgetHoursValuBudget= [];
  var arrayBudgetHoursValueSpent= [];
  var arrayBudgetCostsValueBudget = [];
  var arrayBudgetCostsValueSpent = [];
  var arrayBudgetTotalValueBudget = [];
  var arrayBudgetTotalValueSpent= [];
  var arrayBudgetTotalValueInvoiced= [];

    for (i; i < jsonObject.data.length; i++){
      arrayProjectManagerName.push([jsonObject.data[i].project_manager.name])
      arrayOrganizationName.push([jsonObject.data[i].organization.name])   
      arrayProjectName.push([jsonObject.data[i].name])    
      //arrayBudgetHoursAmountBudget.push([jsonObject.data[i].budget.hours.amount_budget])
      //arrayBudgetHoursAmountSpent.push([jsonObject.data[i].budget.hours.amount_spent])
      //arrayBudgetHoursValuBudget.push([jsonObject.data[i].budget.hours.value_budget])
      //arrayBudgetHoursValueSpent.push([jsonObject.data[i].budget.hours.value_spent]) 
      arrayBudgetCostsValueBudget.push([jsonObject.data[i].budget.costs.value_budget])
      arrayBudgetCostsValueSpent.push([jsonObject.data[i].budget.costs.value_spent]) 
      arrayBudgetTotalValueBudget.push([jsonObject.data[i].budget.total.value_budget]) 
      arrayBudgetTotalValueSpent.push([jsonObject.data[i].budget.total.value_spent])  
      arrayBudgetTotalValueInvoiced.push([jsonObject.data[i].budget.total.value_invoiced])  
    }



1 Ответ

1 голос
/ 31 января 2020

Вы можете использовать Object.prototype.hasOwnProperty

Вы можете вложить это в строку как

jsonObject.data[i].hasOwnProperty('budget') && jsonObject.data[i].budget.hasOwnProperty('hours') && jsonObject.data[i].budget.hours.hasOwnProperty('amount_budget') 

В качестве альтернативы вы можете сделать вспомогательную функцию, которая будет проверять глубину чтобы вы не повторяли эту логику c снова и снова

hasProperty = (obj, property) => { 
  if(!property){ 
    return true;
  }
  let props = property.split('.');

  return obj.hasOwnProperty(props[0]) && hasProperty(obj[props[0]], props.splice(1).join('.')); 
}

Дальнейшие предложения вы можете найти в этом SO вопросе

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