2017-01-05 1 views
0

Учитывая следующий массив:Массив объектов, объединяйте значения, где ключевые совпадения. подчеркиванием

[ 
{ 
     "real":104.1530776708426, 
     "workHour":8, 
     "value":null 
    }, 
    { 
     "real":71.53948769310401, 
     "workHour":9 
    }, 
    { 
     "real":97.84076993321577, 
     "workHour":10 
    }, 
    { 
     "real":115.72564185649178, 
     "workHour":11 
    }, 
    { 
     "real":79.95589800993977, 
     "workHour":12 
    }, 
    { 
     "real":91.52846219558896, 
     "workHour":13 
    }, 
    { 
     "real":57.86282092824589, 
     "workHour":14 
    }, 
    { 
     "real":148.33923183423036, 
     "workHour":15 
    }, 
    { 
     "real":125.19410346293202, 
     "workHour":16 
    }, 
    { 
     "real":67.33128253468612, 
     "workHour":17 
    }, 
    { 
     "real":55.75871834903695, 
     "workHour":18 
    }, 
    { 
     "real":102.04897509163365, 
     "workHour":19 
    }, 
    { 
     "real":132.55846249016332, 
     "workHour":20 
    }, 
    { 
     "real":138.87077022779013, 
     "workHour":21 
    }, 
    { 
     "real":60, 
     "workHour":8 
    }, 
    { 
     "real":52, 
     "workHour":9 
    }, 
    { 
     "real":114, 
     "workHour":10 
    }, 
    { 
     "real":115, 
     "workHour":11 
    }, 
    { 
     "real":92, 
     "workHour":12 
    }, 
    { 
     "real":102, 
     "workHour":13 
    }, 
    { 
     "real":54, 
     "workHour":14 
    }, 
    { 
     "real":62, 
     "workHour":15 
    }, 
    { 
     "real":133, 
     "workHour":16 
    }, 
    { 
     "real":116, 
     "workHour":17 
    }, 
    { 
     "real":106, 
     "workHour":18 
    }, 
    { 
     "real":115, 
     "workHour":19 
    }, 
    { 
     "real":115, 
     "workHour":20 
    }, 
    { 
     "real":125, 
     "workHour":21 
    } 
] 

Как я могу найти, где workHour матч, и объединить real там? Я сделал это с чистым JS

const array = [{"real":104.1530776708426,"workHour":8,"value":null},{"real":71.53948769310401,"workHour":9},{"real":97.84076993321577,"workHour":10},{"real":115.72564185649178,"workHour":11},{"real":79.95589800993977,"workHour":12},{"real":91.52846219558896,"workHour":13},{"real":57.86282092824589,"workHour":14},{"real":148.33923183423036,"workHour":15},{"real":125.19410346293202,"workHour":16},{"real":67.33128253468612,"workHour":17},{"real":55.75871834903695,"workHour":18},{"real":102.04897509163365,"workHour":19},{"real":132.55846249016332,"workHour":20},{"real":138.87077022779013,"workHour":21},{"real":60,"workHour":8},{"real":52,"workHour":9},{"real":114,"workHour":10},{"real":115,"workHour":11},{"real":92,"workHour":12},{"real":102,"workHour":13},{"real":54,"workHour":14},{"real":62,"workHour":15},{"real":133,"workHour":16},{"real":116,"workHour":17},{"real":106,"workHour":18},{"real":115,"workHour":19},{"real":115,"workHour":20},{"real":125,"workHour":21}]; 
 
var map = {}; 
 
    for (var i=0; i<array.length; i++) { 
 
     var obj = array[i], 
 
      id = obj.workHour; 
 
     if (id in map) { // we know this id already 
 
      // get the object and sum properties 
 
      map[id].real += obj.real; 
 
     } else // create a new one 
 
      map[id] = { 
 
       workHour: id, 
 
       real: obj.real, 
 
      }; 
 
    } 
 
console.log(map)

Как я могу сделать это с ES6? или Подчеркивание?

+0

Вы хотите час работы в качестве ключа, или просто объединить их, как это? – Jecoms

ответ

1

Loop массив с Array#reduce, чтобы создать новый объект с комбинированными значениями:

var data = [{"real":104.1530776708426,"workHour":8,"value":null},{"real":71.53948769310401,"workHour":9},{"real":97.84076993321577,"workHour":10},{"real":115.72564185649178,"workHour":11},{"real":79.95589800993977,"workHour":12},{"real":91.52846219558896,"workHour":13},{"real":57.86282092824589,"workHour":14},{"real":148.33923183423036,"workHour":15},{"real":125.19410346293202,"workHour":16},{"real":67.33128253468612,"workHour":17},{"real":55.75871834903695,"workHour":18},{"real":102.04897509163365,"workHour":19},{"real":132.55846249016332,"workHour":20},{"real":138.87077022779013,"workHour":21},{"real":60,"workHour":8},{"real":52,"workHour":9},{"real":114,"workHour":10},{"real":115,"workHour":11},{"real":92,"workHour":12},{"real":102,"workHour":13},{"real":54,"workHour":14},{"real":62,"workHour":15},{"real":133,"workHour":16},{"real":116,"workHour":17},{"real":106,"workHour":18},{"real":115,"workHour":19},{"real":115,"workHour":20},{"real":125,"workHour":21}]; 
 

 

 
var result = data.reduce(function(r, o) { 
 
    if (r[o.workHour]) { 
 
    r[o.workHour].real += o.real 
 
    } else { 
 
    r[o.workHour] = { 
 
     workHour: o.workHour, 
 
     real: o.real 
 
    } 
 
    } 
 

 
    return r; 
 
}, {}); 
 

 
console.log(result);

1

Использование lodash (/ подчеркивание), это использует _.reduce() с _.clone() построить агрегатный объект. Значения этого объекта затем выводятся как массив объектов, похожих на ваш входной массив, с использованием _.values().

var data = [{"real":104.1530776708426,"workHour":8,"value":null},{"real":71.53948769310401,"workHour":9},{"real":97.84076993321577,"workHour":10},{"real":115.72564185649178,"workHour":11},{"real":79.95589800993977,"workHour":12},{"real":91.52846219558896,"workHour":13},{"real":57.86282092824589,"workHour":14},{"real":148.33923183423036,"workHour":15},{"real":125.19410346293202,"workHour":16},{"real":67.33128253468612,"workHour":17},{"real":55.75871834903695,"workHour":18},{"real":102.04897509163365,"workHour":19},{"real":132.55846249016332,"workHour":20},{"real":138.87077022779013,"workHour":21},{"real":60,"workHour":8},{"real":52,"workHour":9},{"real":114,"workHour":10},{"real":115,"workHour":11},{"real":92,"workHour":12},{"real":102,"workHour":13},{"real":54,"workHour":14},{"real":62,"workHour":15},{"real":133,"workHour":16},{"real":116,"workHour":17},{"real":106,"workHour":18},{"real":115,"workHour":19},{"real":115,"workHour":20},{"real":125,"workHour":21}]; 
 

 
var result = _.values(_.reduce(data, (sumObj, curr) => { 
 
    if (sumObj[curr.workHour]) 
 
    sumObj[curr.workHour].real += curr.real; 
 
    else  
 
    sumObj[curr.workHour] = _.clone(curr); 
 
    
 
    return sumObj; 
 
}, {})); 
 

 
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

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