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.
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.
output
object and specify its type
.Array#filter
to select the entries in data
with the matching type.Array#flatMap
to select the features
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);
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);
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));
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.