在 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
数组。
- 创建
output
对象并指定其 type
。
- 使用
Array#filter
到 select data
中具有匹配类型的条目。
- 使用
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);
我无法在打字稿中组合 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
数组。
- 创建
output
对象并指定其type
。 - 使用
Array#filter
到 selectdata
中具有匹配类型的条目。 - 使用
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);