在Typescript中组合对象数组中的对象



我在typescript中组合对象数组中的对象时遇到问题。

阵列看起来是这样的:

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

我需要的是一个对象(没有数组(;特征";组合-所以它看起来像这样:

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

我对打字很陌生,所以很抱歉这个可能很简单的问题。。。

非常感谢!!

编辑:也许这个问题太难理解了。希望这有帮助:阵列(134(意味着里面有134个物体。当对象(集合(的数组为2长时,这可以手动完成我需要的操作:

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

我需要为任何长度的收藏品制作这件作品。

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

  1. 创建output对象并指定其type
  2. 使用Array#filter选择data中具有匹配类型的条目
  3. 使用Array#flatMap从上面的每个条目中选择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);

只需使用一个简单的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));

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

最新更新