Javascript массив конвертировать в определенный формат - PullRequest
0 голосов
/ 02 сентября 2018

Массив объектов является динамическим

Действия могут быть четырех типов (Idle, Down, Up, Waiting)

Если статус активности открытый , следующий статус активности - закрыть , но активность такая же.

Как конвертировать в ожидаемый результат?

var arr = [
  { Activity: 'Idle', Activity_Status: 'Open', Activity_Date: "2018-09-02T12:30:00.000Z" },
  { Activity: 'Idle', Activity_Status: 'Close', Activity_Date: "2018-09-02T14:00:00.000Z"},
  { Activity: 'Down', Activity_Status: 'Open',  Activity_Date: "2018-09-02T17:30:00.000Z" },
  { Activity: 'Down', Activity_Status: 'Close', Activity_Date: "2018-09-02T19:00:00.000Z"}
]

Ожидаемый результат:

[
  { Activity: 'Idle', From: "2018-09-02T12:30:00.000Z", To: "2018-09-02T14:30:00.000Z" },
  { Activity: 'Down', From: "2018-09-02T17:30:00.000Z", To: "2018-09-02T19:00:00.000Z" }
]

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Поскольку сразу за статусом open следует соответствующий ему статус close , используйте простой цикл for, пропустите все остальные индексы, выполнив i += 2 и для каждой итерации слияния текущий объект и следующий примерно так:

var result = [];
for(var i = 0; i < arr.length; i += 2) {
  result.push(
    { Activity: arr[i].Activity, From: arr[i].Activity_Date, To: arr[i + 1].Activity_Date }
  );
}

Пример:

var arr = [ { Activity: 'Idle', Activity_Status: 'Open', Activity_Date: "2018-09-02T12:30:00.000Z" }, { Activity: 'Idle', Activity_Status: 'Close', Activity_Date: "2018-09-02T14:00:00.000Z"}, { Activity: 'Down', Activity_Status: 'Open',  Activity_Date: "2018-09-02T17:30:00.000Z" }, { Activity: 'Down', Activity_Status: 'Close', Activity_Date: "2018-09-02T19:00:00.000Z"} ];

var result = [];
for(var i = 0; i < arr.length; i += 2) {
  result.push(
    { Activity: arr[i].Activity, From: arr[i].Activity_Date, To: arr[i + 1].Activity_Date }
  );
}

console.log(result);

А если вам нужен функциональный способ сделать это, то:

let result = Array.from({length: arr.length / 2}).map((_, i) =>
  ({ Activity: arr[i].Activity, From: arr[i].Activity_Date, To: arr[i + 1].Activity_Date })
);
* ** 1 022 тысяча двадцать-один * Пример:

var arr = [ { Activity: 'Idle', Activity_Status: 'Open', Activity_Date: "2018-09-02T12:30:00.000Z" }, { Activity: 'Idle', Activity_Status: 'Close', Activity_Date: "2018-09-02T14:00:00.000Z"}, { Activity: 'Down', Activity_Status: 'Open',  Activity_Date: "2018-09-02T17:30:00.000Z" }, { Activity: 'Down', Activity_Status: 'Close', Activity_Date: "2018-09-02T19:00:00.000Z"} ];

let result = Array.from({length: arr.length / 2}).map((_, i) =>
  ({ Activity: arr[i].Activity, From: arr[i].Activity_Date, To: arr[i + 1].Activity_Date })
);

console.log(result);
0 голосов
/ 02 сентября 2018

<script>
var arr = [{Activity: 'Idle',
              Activity_Status: 'Open',
              Activity_Date: "2018-09-02T12:30:00.000Z" },
            {Activity: 'Idle',
              Activity_Status: 'Close',
              Activity_Date: "2018-09-02T14:00:00.000Z"}, 
            {Activity: 'Down',
              Activity_Status: 'Open',
              Activity_Date: "2018-09-02T17:30:00.000Z" },
            {Activity: 'Down',
              Activity_Status: 'Close',
              Activity_Date: "2018-09-02T19:00:00.000Z"}];

var output = [
{Activity: 'Idle', From: "", To: "" },
{Activity: 'Down', From: "", To: "" },
{Activity: 'Up', From: "", To: "" },
{Activity: 'Waiting', From: "", To: ""}
];

var i =0;
while(i < output.length){

  var j = 0;
  var activity = output[i]["Activity"];
  while(j < arr.length){

    if(arr[j]["Activity"] == activity){
    
      if(arr[j]["Activity_Status"] == "Open"){
      
      output[i]["From"] = arr[j]["Activity_Date"];
      
      }else if(arr[j]["Activity_Status"] == "Close"){
      
      output[i]["To"] = arr[j]["Activity_Date"];
      
      }
    
    }

  j++;

  }

i++;

}

console.log(output);
              
</script>
0 голосов
/ 02 сентября 2018

Я создам Объект с ключом в качестве значения «Активность», а затем получу значения из результирующего объекта для получения желаемого результата.

var arr = [{
  Activity: 'Idle',
  Activity_Status: 'Open',
  Activity_Date: "2018-09-02T12:30:00.000Z"
}, {
  Activity: 'Idle',
  Activity_Status: 'Close',
  Activity_Date: "2018-09-02T14:00:00.000Z"
}, {
  Activity: 'Down',
  Activity_Status: 'Open',
  Activity_Date: "2018-09-02T17:30:00.000Z"
}, {
  Activity: 'Down',
  Activity_Status: 'Close',
  Activity_Date: "2018-09-02T19:00:00.000Z"
}]

var result = arr.reduce((mem, cur) => {
  var key = cur.Activity;
  if (mem[key]) {
    return cur['Activity_Status'] === 'Open' ? { ...mem,
        [key]: { ...mem[key],
          "From": cur['Activity_Date']
        }
      } :
      { ...mem,
        [key]: { ...mem[key],
          "To": cur['Activity_Date']
        }
      }
  } else {
    return cur['Activity_Status'] === 'Open' ? { ...mem,
        [key]: { ...mem[key],
          "From": cur['Activity_Date'],
          Activity: key
        }
      } :
      { ...mem,
        [key]: { ...mem[key],
          "To": cur['Activity_Date'],
          Activity: key
        }
      }
  }
}, {});

console.log(Object.values(result));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...