2016-03-01 3 views
-1

У меня есть массив объектов. Свойства ссылки на объекты, которые необходимо изучить. Однако свойства являются необязательными и могут не передаваться. Это приводит к ошибке.свойства ссылок, которые еще не определены

Вот значительно упрощенная версия коды:

var build = { 
    execute: function (type, data) { 
     switch (type) { 

      case "fullName": 
       return build.fullName(data); 
     } 
    }, 
    fullName: function(data){ 
     return data[0] + data[1] 
    } 
}; 

// assume this is the actual inbound data after parsing 
var sample_event = { 
    customer: { 
     firstName: "bob", 
     lastName: "smith", 
     email: "[email protected]" 
    } 
}; 


function cleanStuff(event) { 

    // potential inbound data 

    var prospects = [ 
     {parent: "customer", type: build.fullName, newField: 'fullName',data: [event.customer.firstName, event.customer.middleName, event.customer.lastName]}, 
     {parent: "customer", type: build.fullName, newField:'fullName', data: [event.idontexist.firstName, event.seller.middleName, event.seller.lastName]} 
    ]; 

    function calc(type, newField, calculationData) { 
     var calculated = calculated || {}; 
     return calculated[newField] = build.execute(type, calculationData); 
    } 

    var filteredList = prospects.filter(function (x) { 
     if (event[x.parent] !== undefined) { 
      return x 
     } 
    }); 

    filteredList.forEach(function (item) { 
     var type = item.type, 
      fieldName = item.fieldName, 
      data = item.data; 

     calc(type, fieldName, data, event); 

    }); 
} 

cleanStuff(sample_event); 

Как можно идти о ссылках свойства, которые не существуют? Я НЕ хочу создавать пустые свойства или устанавливать их в null. Я хочу просто избежать очистки их, если они не были отправлены в приложение.

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

Я также рассматривал возможность создания прокси-сервера с использованием ES6, но Chrome имеет обновление с последней спецификацией.

Я использую массив «перспективы» в качестве таблицы поиска, чтобы сказать: «Эй, если это значение отправлено, сделайте X для него».

+0

Почему вы ссылаетесь на значения, которые еще не существуют? Для меня это звучит как проблема с вашим дизайном. –

+0

Я получаю входящую почту JSON, содержащую кучу дополнительных данных. В этом массиве «перспективы» перечислены все значения, которые могут потребовать некоторой нормализации/очистки. Существует метод «нормализации» в другом месте, который принимает входящие данные, проверяет этот массив «перспективы» и выполняет «тип» нормализации относительно соответствующих «данных». Я открыт для любых предложений по лучшему дизайну или шаблонам. – Cyph

+0

Так почему же часть кода пытается получить доступ к объектам, выполняющимся до того, как данные существуют? Не могли бы вы показать, как вы делаете такой доступ, чтобы иметь [mcve]? –

ответ

0

Я нашел, что использование недавно введенного прокси (ES6) хорошо работает здесь и позволяет мне устанавливать ловушки для обработки этих сценариев. Очень классное дополнение к JS, позволяет отличную абстракцию.

function Event(event) { 
    var proxy = new Proxy(event, { 

     get: function (target, property) { 
      if (property in target) { 
       return target[property]; 
      } else { 
       return " "; 
      } 
     } 
    }); 

    return proxy; 
} 



var event = new Event(sample_event); 
-1

Использование Babel (возможно, через Webpack или Browserify) для компиляции кода ES6, и проблема решена?

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

Смежные вопросы