javascript转置一个对象数组

时间:2017-03-18 22:57:23

标签: javascript jquery arrays

我试图在javascript中转置一个对象数组。

我有这个对象数组:



var myData = [	
{"shift":"1","date":"01/01/2016/08/00/00","car":"178","truck":"255","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00","car":"125","truck":"189","bike":"445","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00","car":"140","truck":"219","bike":"328","moto":"412"},
{"shift":"4","date":"02/01/2016/17/00/00","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00","car":"230","truck":"170","bike":"390","moto":"400"}
];
out = '';
$.each(myData, function(ndx,obj){
	 out += '{';
	 $.each(obj, function(key,val){
   		out += key +':'+ val +',';
   });
   out += '}<br>';
});
$('body').append(out);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

我需要它进行转置,以便(转置时)看起来像这样(注意:我手动执行此操作,我需要以编程方式执行此操作 - 并按上述方式打印):

var myData2 = [
{"shift":"1","shift":"2","shift":"3","shift":"4","shift":"5","shift":"6","shift":"7","shift":"8","shift":"9","shift":"10","shift":"11","shift":"12"},
{"date":"01/01/2016/08/00/00","date":"01/01/2016/17/00/00","date":"02/01/2016/08/00/00","date":"02/01/2016/17/00/00","date":"03/01/2016/08/00/00","date":"03/01/2016/17/00/00","date":"04/01/2016/08/00/00","date":"04/01/2016/17/00/00","date":"05/01/2016/08/00/00","date":"05/01/2016/17/00/00","date":"06/01/2016/08/00/00","date":"06/01/2016/17/00/00"},
{"car":"178","car":"125","car":"140","car":"222","car":"200","car":"230","car":"155","car":"179","car":"208","car":"150","car":"200","car":"230"},
{"truck":"255","truck":"189","truck":"219","truck":"290","truck":"250","truck":"220","truck":"177","truck":"203","truck":"185","truck":"290","truck":"220","truck":"170"},
{"bike":"317","bike":"445","bike":"328","bike":"432","bike":"420","bike":"310","bike":"377","bike":"405","bike":"360","bike":"315","bike":"350","bike":"390"},
{"moto":"237","moto":"273","moto":"412","moto":"378","moto":"319","moto":"413","moto":"180","moto":"222","moto":"195","moto":"280","moto":"205","moto":"400"}
];

jsFiddle

3 个答案:

答案 0 :(得分:5)

您想要的结果具有重复的属性,这是不允许的。

相反,您可以将内部结构转换为仅包含值的数组,并将其分配给属性。像这样:

{
  "shift": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
  "date": ["01/01/2016/08/00/00", "01/01/2016/17/00/00", // ...etc
}

您可以将此ES6代码用于该转换:

const result = Object.assign(...Object.keys(myData[0]).map( key =>
    ({ [key]: myData.map( o => o[key] ) })
));

var myData = [	
{"shift":"1","date":"01/01/2016/08/00/00","car":"178","truck":"255","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00","car":"125","truck":"189","bike":"445","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00","car":"140","truck":"219","bike":"328","moto":"412"},
{"shift":"4","date":"02/01/2016/17/00/00","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00","car":"230","truck":"170","bike":"390","moto":"400"}
];

const result = Object.assign(...Object.keys(myData[0]).map( key =>
    ({ [key]: myData.map( o => o[key] ) })
));

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

如果您不能保证所有对象都具有相同的属性,但您希望在输出中表示所有出现的属性,那么您可以首先收集所有出现的属性并保留唯一键(使用{{1 }}):

Set

const result = Object.assign(...Array.from(
    new Set(myData.reduce((keys, o) => keys.concat(Object.keys(o)), [] )),
    key => ({ [key]: myData.map( o => o[key] ) })
));
var myData = [	
{"shift":"1","date":"01/01/2016/08/00/00","car":"178","truck":"255","bike":"317","moto":"237"},
{"shift":"2","date":"01/01/2016/17/00/00","car":"125","truck":"189","bike":"445","moto":"273"},
{"shift":"3","date":"02/01/2016/08/00/00","car":"140","truck":"219","bike":"328","moto":"412"},
{"shift":"4","date":"02/01/2016/17/00/00","car":"222","truck":"290","bike":"432","moto":"378"},
{"shift":"5","date":"03/01/2016/08/00/00","car":"200","truck":"250","bike":"420","moto":"319"},
{"shift":"6","date":"03/01/2016/17/00/00","car":"230","truck":"220","bike":"310","moto":"413"},
{"shift":"7","date":"04/01/2016/08/00/00","car":"155","truck":"177","bike":"377","moto":"180"},
{"shift":"8","date":"04/01/2016/17/00/00","car":"179","truck":"203","bike":"405","moto":"222"},
{"shift":"9","date":"05/01/2016/08/00/00","car":"208","truck":"185","bike":"360","moto":"195"},
{"shift":"10","date":"05/01/2016/17/00/00","car":"150","truck":"290","bike":"315","moto":"280"},
{"shift":"11","date":"06/01/2016/08/00/00","car":"200","truck":"220","bike":"350","moto":"205"},
{"shift":"12","date":"06/01/2016/17/00/00","car":"230","truck":"170","bike":"390","moto":"400"}
];

const result = Object.assign(...Array.from(
    new Set(myData.reduce((keys, o) => keys.concat(Object.keys(o)), [] )),
    key => ({ [key]: myData.map( o => o[key] ) })
));

console.log(result);

答案 1 :(得分:1)

对于使用新的 Object.fromEntries 函数的安全打字稿友好等效于 trincot 的 oneliner:

const result = Object.fromEntries(Object.keys(myData[0]).map(key => [key, myData.map(o => o[key])]))

稍微分解一下:

const keys = Object.keys(myData[0]);
const entries = keys.map(key => [key, myData.map(o => o[key])]);
const result = Object.fromEntries(entries)

如果没有键,使用 Object.assign 和扩展运算符的原始代码将抛出错误,因此 TS 编译器拒绝该代码并显示错误“预期至少有 1 个参数,但得到 0 或更多。”。如果没有键,新代码将生成 {}

答案 2 :(得分:0)

由于对象不能有重复的属性,我建议使用与数组相同的属性名来累积值:

Route::get('/admin', [
        'uses' => 'AdminController@index',
        'middleware' => 'roles',
        'roles' => ['Admin']
    ]);

Route::post('/admin/change', [
    'uses' => 'AdminController@change',
    'as' => 'change',
    'middleware' => 'roles',
    'roles' => ['Admin']
]);