在 Typescript 中将 objects 合并到 objects 的数组中?

Combine objects in an array of objects in Typescript?

我无法在打字稿中组合 Objects 数组中的 object。

数组看起来像这样:

0: {type: 'FeatureCollection', features: Array(134)}
1: {type: 'FeatureCollection', features: Array(109)}

我需要的是一个 object(无数组),其中包含所有“功能”组合 - 所以它看起来像这样:

{type: 'FeatureCollection', features: Array(243)}

我是 typescript 的新手,很抱歉这个可能很简单的问题...

非常感谢!!

编辑:也许这个问题不太好理解。希望这会有所帮助:Array(134) 意味着里面有 134 Objects。当 objects (collection) 的数组长度为 2 时,这会手动执行我需要的操作:

  const result = [...collection[0].features, ...collection[1].features];
  const resultCollection: FeatureCollection = collection[0];
  resultCollection.features = result;

我需要在 collection.

的任意长度上完成这项工作

使用reduce函数:

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

---- 已编辑----

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

只需使用一个简单的 Array.prototype.reduce 函数和扩展运算符

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

您正在寻找这样的东西吗?您需要添加类型,但您可以使用原始 JS 方法合并 data 数组中所有条目的 features 数组。

  1. 创建 output 对象并指定其 type
  2. 使用 Array#filter 到 select data 中具有匹配类型的条目。
  3. 使用 Array#flatMap 到 select 来自上面每个条目的 features 数组,并将它们的内容投影到一个数组中。

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