合并复杂的多维数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并复杂的多维数组相关的知识,希望对你有一定的参考价值。
在javascript中,我创建了一个多维数组,但出于其他目的,我需要转换它。
所以我的阵列是这样的
array [
0 =>
"ulStatic": [
0 =>
"day": "2019-03-30 18:30:00"
"id": "7"
"origin": "intentions"
]
"ulDynamic": [
0 =>
"day": "2019-03-30 18:30:00"
"id": "275"
"origin": "obs"
]
"ulCreatedDynamic": []
1 =>
"ulStatic": [
0 =>
"day": "2019-03-31 09:30:00"
"id": "8"
"origin": "intentions"
]
"ulDynamic": []
"ulCreatedDynamic": []
2 =>
"ulStatic": []
"ulDynamic": []
"ulCreatedDynamic": [
0 =>
"day": "2019-04-03 19:30:00"
"id": "277"
"origin": "obs"
]
]
而我正试图拥有这个数组:
array [
0 =>
"day": "2019-03-30 18:30:00"
"elements": [
0 =>
"id": "7"
"origin": "intentions"
1 =>
"id": "275"
"origin": "obs"
]
1 =>
"day": "2019-03-31 09:30:00"
"elements": [
0 =>
"id": "8"
"origin": "intentions"
]
2 =>
"day": "2019-04-03 19:30:00"
"elements": [
0 =>
"id": "277"
"origin": "obs"
]
]
我必须承认,我不知道从哪里开始。我正在寻找map(),splice(),concat(),但这对我来说很困惑。你能帮我提一些建议吗?
谢谢
答案
您可以通过迭代对象及其数组的值的值来按day
对数据进行分组。
var array = [ ulStatic: [ day: "2019-03-30 18:30:00", id: "7", origin: "intentions" ], ulDynamic: [ day: "2019-03-30 18:30:00", id: "275", origin: "obs" ], ulCreatedDynamic: [] , ulStatic: [ day: "2019-03-31 09:30:00", id: "8", origin: "intentions" ], ulDynamic: [], ulCreatedDynamic: [] , ulStatic: [], ulDynamic: [], ulCreatedDynamic: [ day: "2019-04-03 19:30:00", id: "277", origin: "obs" ] ],
result = array.reduce((r, o) =>
Object
.values(o)
.forEach(a => a.forEach(( day, id, origin ) =>
var temp = r.find(p => day === p.day);
if (!temp) r.push(temp = day, elements: [] );
temp.elements.push( id, origin );
));
return r;
, []);
console.log(result);
.as-console-wrapper max-height: 100% !important; top: 0;
另一答案
let originalArr = [
ulStatic: [
day: '2019-03-30 18:30:00',
id: '7',
origin: 'intentions'
],
ulDynamic: [
day: '2019-03-30 18:30:00',
id: '275',
origin: 'obs'
],
ulCreatedDynamic: [],ulStatic: [
day: '2019-03-31 09:30:00',
id: '8',
origin: 'intentions'
],
ulDynamic: [],
ulCreatedDynamic: [], ulStatic: [],
ulDynamic: [],
ulCreatedDynamic: [
day: '2019-04-03 19:30:00',
id: '277',
origin: 'obs'
]];
let op = originalArr.map(item =>
let ulStatic = item.ulStatic.map(ul =>
return
id: ul.id,
origin: ul.origin
;
);
let ulDynamic = item.ulDynamic.map(ul =>
return
id: ul.id,
origin: ul.origin
;
);
let ulCreatedDynamic = item.ulCreatedDynamic.map(ul =>
return
id: ul.id,
origin: ul.origin
;
);
let day;
if (ulStatic.length > 0)
day = item.ulStatic[0].day;
else if (ulDynamic.length > 0)
day = item.ulDynamic[0].day;
else if (ulCreatedDynamic.length > 0)
day = item.ulCreatedDynamic[0].day;
return
day: day,
elements: [].concat(ulStatic).concat(ulDynamic)
;
);
console.log(op);
另一答案
将day
的输入与reduce
分组并返回对象值。
const inputAry = [
"ulStatic": [
"day": "2019-03-30 18:30:00",
"id": "7",
"origin": "intentions"
],
"ulDynamic": [
"day": "2019-03-30 18:30:00",
"id": "275",
"origin": "obs"
],
"ulCreatedDynamic": []
,
"ulStatic": [
"day": "2019-03-31 09:30:00",
"id": "8",
"origin": "intentions",
],
"ulDynamic": [],
"ulCreatedDynamic": []
,
"ulStatic": [],
"ulDynamic": [],
"ulCreatedDynamic": [
"day": "2019-04-03 19:30:00",
"id": "277",
"origin": "obs"
]
];
const groupByDay = inputAry.reduce((group, statics) =>
// flattens the statics array
[].concat.apply([], Object.values(static))
.forEach((day, id, origin) =>
// creates a dictionary entry with day as key, if already exist use the existing one or creates a new entry
group[day] = group[day] || day, elements: [] ;
// push the id and origin to elements
group[day].elements.push( id, origin );
);
return group;
, );
const expectedResult = Object.values(groupByDay);
console.log(expectedResult);
以上是关于合并复杂的多维数组的主要内容,如果未能解决你的问题,请参考以下文章