2015-09-08 5 views
0

У меня есть ситуация, о которой я размышлял некоторое время, и, похоже, не нашел логики для ее решения. надеюсь, что сможешь.javascript посылает атрибуты объекта функции

У меня есть ряд кнопок, которые я хотел бы отслеживать, пример одной такой:

при нажатии кнопки функция вызывается, посылая некоторые строки и объект с рядом атрибутов. разные кнопки имеют разные наборы атрибутов.

$(".btn").on('click', function(ev){ 
    trackFunction("Purchase","apply_promo", { product_code: "product1", last_page: "home", refer: "facebook", promo: "12345" }); 
}); 

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

dataToSend = { event_type : eventType, event_value: eventValue, data }; 

где данные каждый и каждый атрибут из объекта, кнопка отправляет. в этом примере woud быть что-то вроде этого

dataToSend = { event_type : eventType, event_value: eventValue, data.product_code, data.last_page, data.refer, data.promo };` 

здесь моя трекинга функция:

function trackFunction(eventType, eventValue, data) { 
    dataToSend = { event_type : eventType, event_value: eventValue, data }; 
    analyze(dataToSend); 
    return true; 
} 

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

надеюсь, я сделал себе ясным. и большое спасибо.

+0

Где моя проблема? При построении вы не знаете, как получить все атрибуты объекта? Или, в конце концов, вы не знаете, к какой собственности вы должны иметь доступ? – Superdrac

+0

Я не знаю, как получить все атрибуты объекта, а затем отправить их вместе в функцию. –

+0

Являются ли атрибуты только текстовыми значениями? – Superdrac

ответ

1

Либо вы добавляете общие свойства к объекту каждый раз. Недостатком является то, что вы изменения параметра функции, которая обычно плохая идея, потому что это может вызвать странные ошибки:

function track(a, b, data) { 
    data.a = a; 
    data.b = b; 
    sendData(data); 
} 

Или превратить его вокруг, итерация свойств объекта:

function track(a, b, data) { 
    var send = {a: a, b: b}, k; 
    for (k in data) { 
     if (data.hasOwnProperty(k)) { 
      send[k] = data[k]; 
     } 
    } 
    sendData(send); 
} 

Если вы используете lodash, underscore или jQuery (или, возможно, все другие структуры JS), у вас обычно есть функция extend, которая в значительной степени делает то, что вы хотите (и внутренне такое же, как во втором примере).

// with underscore: 
function track(a, b, data) { 
    sendData(_.extend({a: a, b: b}, data)); 
} 
Смежные вопросы