i am having trouble combining objects from an array of Objects in typescript.
the Array looks like that:
0: {type: 'FeatureCollection', features: Array(134)}
1: {type: 'FeatureCollection', features: Array(109)}
what i need is an object (no array) with all "features" combined - so that it looks like this:
{type: 'FeatureCollection', features: Array(243)}
i am very new to typescript so sorry for that probably easy question...
Thank you so much!!
EDIT: maybe the question was not too good to understand. Hope this helps: Array(134) means there are 134 Objects inside. this does what i need manually when the array of objects (collection) is 2 long:
const result = [...collection[0].features, ...collection[1].features];
const resultCollection: FeatureCollection = collection[0];
resultCollection.features = result;
i need to make this work for any length of collection.
CodePudding user response:
Are you looking for something like this? You'll need to add types, but you can merge the features
arrays from all entries in the data
array using vanilla JS methods.
- Create the
output
object and specify itstype
. - Use
Array#filter
to select the entries indata
with the matching type. - Use
Array#flatMap
to select thefeatures
array from each of the entries above and project their contents into a single array.
const data = [
{ type: 'FeatureCollection', features: [1, 2, 3] },
{ type: 'FeatureCollection', features: [4, 5, 6] }
];
const output = {
type: 'FeatureCollection',
features: data
.filter(obj => obj.type === 'FeatureCollection')
.flatMap(obj => obj.features)
};
console.dir(output);
CodePudding user response:
Just use a simple Array.prototype.reduce
function and the spread operator
const original = [
{ type: "banana", features: ["34", "wow", "hotdog"] },
{ type: "banana", features: ["dog", "cat", "recursion"] },
];
const compress = (original) => original.reduce((acc, cur) => {
acc.features = [...(acc.features ?? []), ...cur.features];
return acc;
}, { type: (original[0].type) });
console.log(compress(original));
CodePudding user response:
With the reduce function :
const array = [
{type: 'FeatureCollection', features: [1, 2, 3]},
{type: 'FeatureCollection', features: [4, 5, 6]},
{type: 'Test', features: [4, 5, 6]}
]
const merged = array.reduce((array, item) => {
const found = array.find((i) => i.type === item.type);
if (found) {
found.features.push(...item.features);
} else {
array.push(item);
}
return array;
}, []);
console.log(merged);
---- EDITED ----
option 2 :
const array = [
{type: 'FeatureCollection', features: [1, 2, 3]},
{type: 'FeatureCollection', features: [4, 5, 6]},
{type: 'Test', features: [4, 5, 6]}
]
const merged = array.reduce((obj, item) => {
if (obj[item.type]) {
obj[item.type].push(...item.features);
} else {
obj[item.type] = item.features;
}
return obj;
}, {} as {[key: string]: number[]});
const keys = Object.keys(merged);
const result = keys.map((k) => ({type: k, features: merged[k]}));
console.log(result);