Хобрук: Ваш путь к мастерству в программировании

суммировать поля на объекте js по 2 поля и создать вместо объекта javascript

Моя цель - у меня есть количество объектов, которые я получаю еженедельно, у каждого из них есть поля date, Full_Name, total_hours и другие. Я хочу отсортировать этот массив объектов по именам и по общему количеству часов каждого дня. пожалуйста, только в javascript без jquery

пример объектов

var anArray = [{
  'End__c':"22:00",
  'Id':"Q45575",
  'Name':"W-299849",
  'Resource_Full_Name__c':"test One",
  'Start__c':"20:00",
  'date__c':"2018-02-04",
  'description__c':"rwqfrwe",
  'total_hours__c':2
},{
  'End__c':"21:00",
  'Id':"Q45551",
  'Name':"W-299809",
  'Resource_Full_Name__c':"test Two",
  'Start__c':"15:00",
  'date__c':"2018-02-01",
  'description__c':"rwqfrwe",
  'total_hours__c':5
},{
  'End__c':"20:00",
  'Id':"Q45515",
  'Name':"W-299849",
  'Resource_Full_Name__c':"test One",
  'Start__c':"10:00",
  'date__c':"2018-02-04",
  'description__c':"rwqfrwe",
  'total_hours__c':2
 }];

вывод должен быть таким, предполагая, что воскресенье 2/4

Имя Всего Вс пн вт ср пт сб

тест Один 6 2 4 0 0 0 0 0

тест Два 3 0 3 0 0 0 0 0

Это то, что у меня есть

    var tmp = {}

    results.workBlockList.forEach(function (item) {
      var tempKey = item.Resource_Full_Name__c + item.date__c;
      if (!tmp.hasOwnProperty(tempKey)) {
        tmp[tempKey] = item;
      } else {
        tmp[tempKey].total_hours__c += item.total_hours__c;
      }
    });

не работает, он только отсортирован по дате и имени и не дает мне только 2 списка, отсортированных по датам


  • добавьте свой код, пожалуйста. 06.02.2018
  • то, что у меня не работает @ TigerTV.ru, поэтому я публикую вопрос 06.02.2018
  • Resource_Full_Name__c или Name в первом столбце вывода? 06.02.2018

Ответы:


1

Вы можете использовать функцию уменьшить.

Посмотрите на этот фрагмент кода

var items = [{
End__c:"22:00", Id:"Q45575",
 Name:"W-299849", Resource_Full_Name__c:"test One", Start__c:"20:00", 
 date__c:"2018-02-04", description__c:"rwqfrwe", total_hours__c:2
 },
 {End__c:"13:00", Id:"A155645",
 Name:"W-299849", Resource_Full_Name__c:"test One", Start__c:"9:00", 
 date__c:"2018-02-05", description__c:"rwqfrwe", total_hours__c:4
},
{
 End__c:"19:00", Id:"A155645",
 Name:"W-299849", Resource_Full_Name__c:"test Two", Start__c:"16:00", 
 date__c:"2018-02-05", description__c:"rwqfrwe", total_hours__c:3
 }];

var result = items.reduce((a, c) => {
  var targetDay = new Date(c.date__c).getDay() === 6 ? 0 :(new Date(c.date__c).getDay() + 1);

  if (a[c.Resource_Full_Name__c]) {
    a[c.Resource_Full_Name__c]['week'][targetDay] += c.total_hours__c;
    a[c.Resource_Full_Name__c]['total'] += c.total_hours__c;
  } else {
    a[c.Resource_Full_Name__c] = { 'total': c.total_hours__c, 'week': new Array(7).fill(0) };
    a[c.Resource_Full_Name__c]['week'][targetDay] = c.total_hours__c;
  }

  return a;
}, {});

result = Object.keys(result).map((k) => ({'workblock': {...result[k], ...{'resource': k}}}))

console.log(result);
.as-console-wrapper {
  max-height: 100% !important
}

06.02.2018
  • Спасибо, это действительно обнадеживает @Ele, еще один вопрос, как это сделать. рабочий блок: {всего: 0,25, неделя: массив (7), ресурс: один тест} в настоящее время это выглядит как этот тест один {всего: 0,25, неделя: массив (7), ресурс: тест один} 06.02.2018
  • на самом деле неважно, я смог понять это, спасибо @Ele 06.02.2018
  • @ AB74574 вы имели в виду массив [{workblock: {total: 0.25, week: Array(7), resource: "test One"}}, {workblock: {total: 0.25, week: Array(7), resource: "test Two"}}] ?? 06.02.2018

  • 2

    Попробуй это:

       
        var items = [{
          'End__c':"22:00",
          'Id':"Q45575",
          'Name':"W-299849",
          'Resource_Full_Name__c':"test One",
          'Start__c':"20:00",
          'date__c':"2018-02-04",
          'description__c':"rwqfrwe",
          'total_hours__c':2
        },{
          'End__c':"21:00",
          'Id':"Q45551",
          'Name':"W-299809",
          'Resource_Full_Name__c':"test Two",
          'Start__c':"15:00",
          'date__c':"2018-02-01",
          'description__c':"rwqfrwe",
          'total_hours__c':5
        },{
          'End__c':"20:00",
          'Id':"Q45515",
          'Name':"W-299849",
          'Resource_Full_Name__c':"test One",
          'Start__c':"10:00",
          'date__c':"2018-02-14",
          'description__c':"rwqfrwe",
          'total_hours__c':2
         }];
         
        var daysHours = {};
        
        items.forEach(function(item){
          var d = new Date(item.date__c);
          var dayOfWeek = d.getDay();
          
          if (typeof daysHours[item.Resource_Full_Name__c] === 'undefined') {
          		daysHours[item.Resource_Full_Name__c] = [0,0,0,0,0,0,0];
          }
          
          daysHours[item.Resource_Full_Name__c][dayOfWeek] += item.total_hours__c;
          
        });
        
        var body = document.getElementById('body');
        
        for (var i in daysHours) {
          var sum = 0;
          daysHours[i].forEach(function(item) {
           sum += item;
          });
          daysHours[i].splice(0, 0, sum);
          body.innerHTML += '<div>"'+i+'" '+daysHours[i]+'</div>';
        }
    <div id='body'></div>

    Выход:

    "test One" 4,2,0,0,2,0,0,0
    "test Two" 5,0,0,0,0,5,0,0
    
    06.02.2018
    Новые материалы

    Обнаружение маски или без маски с YOLO😷
    Это руководство по созданию пользовательской модели обнаружения объектов для обнаружения людей, носящих или не носящих маски в общественных местах, созданной с использованием YOLO v3. Модель..

    Управление приборами в чистом PHP
    Этот пост дополняет эти: E2e тестирование Работа с несколькими средами . Мы разработали это решение для базы данных MariaDB, оно может отличаться, если вы используете другую базу..

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..