我正在使用node.js
我在下面有这个RowDataPacket对象数组;
{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 1,
_CASE_ID: 1
},
{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 2,
_CASE_ID: 2
}
{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 3,
_CASE_ID: 3
}
我想将这个RowDataPacket对象数组缩小为单个对象。收缩后,它看起来像这样;
{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 1,
_CASE_ID: 1,
_CASE_COUNTER: 2,
_CASE_ID: 2,
_CASE_COUNTER: 3,
_CASE_ID: 3
}
键_ID
和_NAME
在RowDataPacket对象数组中具有相同的值。其他键将具有不同的值。如何在node.js v4.7.x中完成?
编辑:它不是原始问题中提到的json对象数组。它是一个RowDataPacket对象数组,它是MySQL查询的结果。
答案 0 :(得分:1)
对象不能有几个相同的键 我建议你把这些数据收集到数组中:
function combine(list) {
return list.reduce((carry, o) => {
for (var k in o) {
if (!carry[k]) carry[k] = [];
carry[k].push(o[k]);
}
return carry;
}, {});
}
var input = [];
input.push({id: 1, tag: 'Tag#1'});
input.push({id: 2, tag: 'Tag#2'});
input.push({id: 3, tag: 'Tag#3'});
var res = combine(input);
console.log(res);
对于不同键的不同行为,我们应该提供一些架构:
function combine(list, schema) {
return list.reduce((carry, o) => {
for (var k in o) {
switch (schema[k]) {
case 'scalar': carry[k] = o[k]; break;// Overwrite
default:
case 'array':
if (!carry[k]) carry[k] = [];
carry[k].push(o[k]);
break;
}
}
return carry;
}, {});
}
var input = [];
input.push({id: 1, tag: 'Tag#1'});
input.push({id: 1, tag: 'Tag#2'});
input.push({id: 1, tag: 'Tag#3'});
var res = combine(input, {id: 'scalar', tag: 'array'});
console.log(res);
答案 1 :(得分:1)
你不能在一个对象中使用相同的索引,但是你可以用不同的方式实现它,缩小的数据格式应该如下所述
{
4:{ //here 4 is _ID
_NAME:"Switch4",
_CASE_COUNTER:[1,2,3], // array of all _CASE_COUTER for same _ID
_CASE_ID:[1,2,3] // array of all _CASE_IDfor same _ID
}
}
让我们假设您的数据结构是
var data=[{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 1,
_CASE_ID: 1
},
{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 2,
_CASE_ID: 2
},
{
_ID: 4,
_NAME: "Switch4",
_CASE_COUNTER: 3,
_CASE_ID: 3
}];
您可以通过以下方式缩小数据
shrink_data={};
for(i=0 ; i < data.length; i++){
if(typeof shrink_data[data[i]._ID] == "undefined")
{
shrink_data[data[i]._ID]={
_NAME: data[i]._NAME,
_CASE_COUNTER: [data[i]._CASE_COUNTER],
_CASE_ID: [data[i]._CASE_ID]
};
}
else
{
shrink_data[data[i]._ID]._CASE_COUNTER.push(data[i]._CASE_COUNTER);
shrink_data[data[i]._ID]._CASE_ID.push(data[i]._CASE_ID);
}
}
console.log(JSON.stringify(shrink_data));
// {"4":{_NAME:"Switch4",_CASE_COUNTER:[1,2,3],_CASE_ID:[1,2,3]}}