[英]javascript array convert to specific format
对象数组是动态的
活动可以有四种类型(空闲,关闭,启动,等待)
如果活动状态为open ,则下一个活动状态为close,但活动是相同的。
如何转换为我的预期输出?
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" }
]
我将创建一个键为“ Activity”值的对象,然后从结果对象获取值以产生所需的输出。
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));
由于打开状态紧随其后的是关闭状态,因此使用简单的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 })
);
例:
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);
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.