我在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
数组。
- 创建
output
对象并指定其type
- 使用
Array#filter
选择data
中具有匹配类型的条目 - 使用
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);