2014-08-20 5 views
1

Я хотел бы агрегировать свойства в массиве объектов и создать другой объект с итогами.Совокупные свойства объекта в JavaScript

Вот пример того, что я работаю над:

Ниже массив объектов, и мы должны суммуdisplayAd_imp, videoAd_imp, tv_imp на основе WeekNo диапазона.

var objArr = [{ 

    "Title": "July 13 - July 19 2014", 
    "displayAd_imp": "15", 
    "videoAd_imp": "75", 
    "tv_imp": "120", 
    "Date": "2014-07-17T00:00:00.000Z", 
    "WeekNo": 29 
}, { 

    "Title": "July 20 - July 26 2014", 
    "displayAd_imp": "25", 
    "videoAd_imp": "65", 
    "tv_imp": "130", 
    "Date": "2014-07-24T00:00:00.000Z", 
    "WeekNo": 30 
}, { 

    "Title": "July 27 - Aug 2 2014", 
    "displayAd_imp": "35", 
    "videoAd_imp": "55", 
    "tv_imp": "140", 
    "Date": "2014-07-31T00:00:00.000Z", 
    "WeekNo": 31 
}, { 

    "Title": "Aug 3 - Aug 9 2014", 
    "displayAd_imp": "55", 
    "videoAd_imp": "25", 
    "tv_imp": "20", 
    "Date": "2014-08-07T00:00:00.000Z", 
    "WeekNo": 32 
}, { 

    "Title": "Aug 10 - Aug 17 2014", 
    "displayAd_imp": "10", 
    "videoAd_imp": "70", 
    "tv_imp": "120", 
    "Date": "2014-08-14T00:00:00.000Z", 
    "WeekNo": 33 
}] 

Функция ниже получает диапазон. Мы передаем данные, начальную неделю и конец недели в качестве параметров, и он фильтрует данные по желаемому диапазону. У меня есть пример JSfiddle, чтобы показать результат.

function CalcWeekRange(data,begin,end){ 
    console.log(data,begin, end); 
    newArr = data.filter(function(item){ 
     return (item.WeekNo >= begin && item.WeekNo <= end); 
    }); 
    console.log(newArr); 

} 

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

{ 
     "displayAd_imp": "140", 
     "videoAd_imp": "290", 
     "tv_imp": "530", 
    } 

Последняя часть, где я застрял :(

Надежда Я сделал вопрос ясно, спасибо заранее

+1

Посмотрите на функцию уменьшения, удивительную для этого варианта использования. – bitoiu

ответ

1

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

function weekRange(begin, end, data) { 
    return data.filter(function(x) { 
    return x.WeekNo >= begin && x.WeekNo <= end; 
    }).reduce(function(acc, x) { 
    Object.keys(acc).forEach(function(k) { 
     acc[k] += Number(x[k]); 
    }); 
    return acc; 
    },{ 
    displayAd_imp: 0, 
    videoAd_imp: 0, 
    tv_imp: 0 
    }); 
} 
+0

Спасибо за быстрый ответ! Вышеприведенный фрагмент возвращает NaN - «{displayAd_imp: NaN, videoAd_imp: NaN, tv_imp: NaN}». Возможно, я могу делать что-то неправильно. Я сделал jsfiddle в вышеупомянутом посте, пожалуйста, не стесняйтесь использовать это для проекта. – habibg

+0

Хорошо работает http://jsfiddle.net/64gcjLku/8/ – elclanrs

+0

Это интересно, я понимаю, почему цифры не работают для меня. свойства имели другой формат. Я обновил http://jsfiddle.net/64gcjLku/9/. Число (x [k]) не может прочитать значение, так как оно содержит «,». Я попытаюсь разобраться в этом. – habibg

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