2017-02-21 2 views
0

Я пытаюсь суммировать значения, которые появляются в массиве объектов, строятся так:Подытоживая повторяющиеся значения свойств в новый объект

[ 
    { token: 'N97235', conversions: '2', payout: '100' }, 
    { token: 'N91567', conversions: '2', payout: '100' }, 
    { token: 'N91567', conversions: '3', payout: '150' }, 
    { token: 'N97759', conversions: '2', payout: '100' }, 
    { token: 'N97240', conversions: '1', payout: '50' }, 
    { token: 'N13925', conversions: '1', payout: '50' }, 
    { token: 'N53285', conversions: '1', payout: '50' }, 
    { token: 'N28312', conversions: '1', payout: '100' }, 
    { token: 'N96475', conversions: '1', payout: '50' }, 
    { token: 'N97759', conversions: '2', payout: '100' }, 
    { token: 'N76951', conversions: '1', payout: '100' }, 
    { token: 'N39108', conversions: '1', payout: '50' }, 
    { token: 'N39108', conversions: '4', payout: '200' }, 
    { token: 'N48854', conversions: '2', payout: '100' }, 
    { token: 'N50179', conversions: '1', payout: '50' }, 
    { token: 'N18804', conversions: '1', payout: '50' }, 
    { token: 'N95631', conversions: '2', payout: '100' }, 
] 

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

{ 
    N97235: { conversions: 2, payout: 100 }, 
    N39108: { conversions: 5, payout: 250 }, 
    N91567: { conversions: 6, payout: 300}, 
    N96475: { conversions: 1, payout: 50}, 
    // ..and so on 
} 

Как вы можете видеть, он нашел дубликаты «записи» в исходном массиве и просуммировать их преобразования и выплаты в новый объект (отдельные записи туда а также с). Я попытался выполнить этот массив (tokens_array [] в этом случае) и прикрепить его свойства объектов к новому созданному объекту (convertions_sum {} one), но проблема заключается в том, что сначала «сбрасывает» свои значения , прежде чем добавить что-нибудь к ним ..

tokens_array.forEach(function(element) { 
    var token_string = element.token.toString(); 
    conversions_sum[token_string] = {}; 
    conversions_sum[token_string].conversions += element.conversions; 
    conversions_sum[token_string].payout += element.payout; 
}); 

Но так conversions_sum [token_string] .conversions и conversions_sum [token_string] .payout не были инициализированы с первого места - это добавляет число к «не определено '..

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

ответ

2

Вы можете использовать Array.prototype.reduce для создания хэш-объект лексемы, как это:

function group(arr) { 
 
    return arr.reduce(function(h, e) {    // for each object e in arr 
 
    if(h[e.token]) {        // if we already hashed the object 
 
     h[e.token].conversions += +e.conversions; // add e's conversions to the hashed object (implicitly convert e.conversions into a number using unary +) 
 
     h[e.token].payout += +e.payout;   // add e's payout to the hashed object as well 
 
    }            
 
    else {          // if not, then create a new object initialized with e's values 
 
     h[e.token] = {conversions: +e.conversions, payout: +e.payout}; 
 
    } 
 

 
    return h; 
 
    }, {}); 
 
} 
 

 
var array = [ 
 
    { token: 'N97235', conversions: '2', payout: '100' }, 
 
    { token: 'N91567', conversions: '2', payout: '100' }, 
 
    { token: 'N91567', conversions: '3', payout: '150' }, 
 
    { token: 'N97759', conversions: '2', payout: '100' }, 
 
    { token: 'N97240', conversions: '1', payout: '50' }, 
 
    { token: 'N13925', conversions: '1', payout: '50' }, 
 
    { token: 'N53285', conversions: '1', payout: '50' }, 
 
    { token: 'N28312', conversions: '1', payout: '100' }, 
 
    { token: 'N96475', conversions: '1', payout: '50' }, 
 
    { token: 'N97759', conversions: '2', payout: '100' }, 
 
    { token: 'N76951', conversions: '1', payout: '100' }, 
 
    { token: 'N39108', conversions: '1', payout: '50' }, 
 
    { token: 'N39108', conversions: '4', payout: '200' }, 
 
    { token: 'N48854', conversions: '2', payout: '100' }, 
 
    { token: 'N50179', conversions: '1', payout: '50' }, 
 
    { token: 'N18804', conversions: '1', payout: '50' }, 
 
    { token: 'N95631', conversions: '2', payout: '100' }, 
 
]; 
 

 
console.log(group(array));

0

Итак, инициализируйте их, не так ли? Вы также каждый раз переписываете свой новый объект, но вы только хотите, когда его не существует. Как так:

conversions_sum[token_string] = conversions_sum[token_string] || { 
    conversions: 0, 
    payout: 0 
}; 
conversions_sum[token_string].conversions += parseInt(element.conversions, 10); 
conversions_sum[token_string].payout += parseInt(element.payout, 10); 
+0

Он отлично работает, но я не уверен, что я полностью понял как этот механизм полностью работает в этой строке - convertions_sum [token_string] = conversionions_sum [token_string] || { конверсий: 0, выплата: 0 }; Когда-то - обнаружено token_string - значит, он просто делает его равным самому себе? Я имею в виду, a = a || {k: 3, r: 4} Что именно он делает, когда a равно? –

+0

Yup, это просто сокращение с помощью '||', поскольку вы хотите инициализировать новый объект только для ключа, если он не существует, поэтому присвоение его самому себе делает? Правильно, ничего не делает. Я просто пытался помочь вам с вашим примером кода, чтобы помочь вам понять, а не переписать всю вашу логику, как это сделал г-н Ибрагим. – rgthree

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