1

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.

3
  • What does Array(134) mean? Is that meant to be a number[] array containing a single-element value of 134? Or do you mean an array (unknown[] or any[]) that contains 134 elements? Commented Mar 22, 2022 at 14:53
  • Just those 2 elements? What about other values for type: besides 'FeatureCollection'? Commented Mar 22, 2022 at 14:54
  • 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. Commented Mar 22, 2022 at 14:57

3 Answers 3

5

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.

  1. Create the output object and specify its type.
  2. Use Array#filter to select the entries in data with the matching type.
  3. Use 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);

Sign up to request clarification or add additional context in comments.

Comments

0

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));

Comments

0

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);

3 Comments

Using array.find() inside your reducer is going to give you awful runtime complexity O( n^2 ) - you should generate an initial grouping of array by type in a Map, then you can get runtime down to O( n ).
Thank you for your reply! but im am having trouble getting the Types right. in this line (obj[item.type]) i get this error: (parameter) obj: FeatureCollection<Geometry | GeometryCollection, Properties> Element implicitly has an 'any' type because expression of type '"FeatureCollection"' can't be used to index type 'FeatureCollection<Geometry | GeometryCollection, Properties>'. Property 'FeatureCollection' does not exist on type 'FeatureCollection<Geometry | GeometryCollection, Properties>'.ts(7053) any hint how to fix that? Thanks!!!
Are you using that library: learn.microsoft.com/en-us/javascript/api/azure-maps-control/… If it's the case all objects have attribute 'type' with value 'FeatureCollection', you just have to create a FeatureCollection object then append all features to our new object.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.